Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <algorithm>
- #include <math.h>
- #include <cmath>
- #include <map>
- #include <stack>
- #include <vector>
- #include <set>
- #include <string>
- #include <fstream>
- #include <queue>
- using namespace std;
- #define ll long long
- #define rt return
- #define all(a) a.begin(), a.end()
- #define mp make_pair
- #define gg std::ios::sync_with_stdio(false);
- const int MAX_SIZE = 2e5 + 10, inf = 1e9 + 7;
- const long long INF = 1e9 + 10, MAX_VAL = 300 * 300 + 10, MOD = 1e9 + 7;
- const double eps = 1e-6, PI = 3.14159;
- void files() {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- }
- int n;
- ll k;
- ll a[3 * MAX_SIZE];
- int ind[3 * MAX_SIZE];
- ll pref[3 * MAX_SIZE];
- void print() {
- cout << endl;
- for (int i = 0; i < 3 * n; i++) {
- if (i % n == 0) {
- cout << "|";
- }
- cout << a[i] << " ";
- }
- cout << endl;
- for (int i = 0; i < 3 * n; i++) {
- if (i % n == 0) {
- cout << "|";
- }
- cout << ind[i] << " ";
- }
- }
- int S;
- pair<int, int> max_len() {
- double g = n;
- S = sqrt(g) + 10;
- int l = 0, r = 0;
- ll sum = 0;
- int min_sz = inf, l_a, r_a;
- while (l < n && r < 2 * n) {
- while (r < 2 * n && sum + a[r] <= k) {
- sum += a[r];
- r++;
- }
- if (min_sz > (r - l + 1)) {
- min_sz = r - l + 1;
- l_a = l;
- r_a = r;
- }
- sum -= a[l];
- l++;
- }
- return mp(l_a, r_a);
- }
- int small_answer(int l) {
- ll sum = 0;
- int it = l, ans = 1;
- for (int i = l; i <= l + n - 1; i++) {
- if (sum + a[i] > k) {
- sum = a[i];
- ans++;
- }
- else {
- sum += a[i];
- }
- }
- return ans;
- }
- void solved_small(pair<int, int> p) {
- int l = p.first, r = l + n - 1;
- int answer = inf;
- for (int mask = l; mask <= min(l + S, 2 * n); mask++) {
- answer = min(answer, small_answer(mask));
- }
- //cout << answer << " FIRST SOLVED";
- cout << answer;
- exit(0);
- }
- void solved_big() {
- int answer = inf;
- for (int mask = 0; mask < n; mask++) {
- int MAX_N = mask + n - 1;
- int ans = 1;
- int now = mask;
- while (now <= MAX_N) {
- now = ind[now] + 1;
- if (now <= MAX_N)
- ans++;
- else
- break;
- }
- answer = min(answer, ans);
- }
- //cout << endl;
- //cout << answer << " SECOND SOLVED";
- cout << answer;
- exit(0);
- }
- void allocation() {
- pair<int, int> p = max_len();
- int len = p.second - p.first;
- if(len < S) solved_small(p);
- else solved_big();
- }
- int main() {
- gg;
- //files();
- cin >> n >> k;
- ll sum = 0;
- for (int i = 0; i < n; i++) {
- cin >> a[i];
- a[i + n] = a[i];
- a[i + 2 * n] = a[i];
- }
- for (int i = 0; i < 3 * n; i++) {
- sum += a[i];
- pref[i] = sum;
- }
- if (sum/3 <= k) {
- cout << 1;
- return 0;
- }
- sum = 0;
- for (int i = 0; i < 2 * n; i++) {
- int l = i, r = 3 * n;
- while (r - l > 1) {
- int m = (r + l) / 2;
- if (pref[m] - sum <= k) {
- l = m;
- }
- else {
- r = m;
- }
- }
- if (pref[r] - sum <= k) {
- ind[i] = r;
- }
- else {
- ind[i] = l;
- }
- sum += a[i];
- }
- allocation();
- print();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement