Submission #1003130

#TimeUsernameProblemLanguageResultExecution timeMemory
1003130coolboy19521Rice Hub (IOI11_ricehub)C++17
0 / 100
13 ms2140 KiB
#include "bits/stdc++.h" #include "ricehub.h" #define i64 long long using namespace std; const int sz = 2e5 + 10; int a[sz]; int n; i64 b; bool che(int x) { int ra = x / 2; int ps = ra; i64 sm = 0; for (int i = 0; i < x; i ++) { sm += abs(a[i] - a[ps]); } if (sm <= b) { return true; } ps ++; for (; ps < n - ra; ps ++) { int pps = ps - 1; // previous ps sm -= abs(a[pps - ra] - a[pps]); // delete leftmost sm -= abs(a[pps] - a[ps]); // delete new ps sm -= (ra - 1); // distance to right decreases sm += abs(a[pps] - a[ps]); // add previous ps sm += (ra - 1); // distance to left increases sm += abs(a[ps + ra] - a[ps]); // add rightmost if (sm <= b) { return true; } } return false; } bool chee(int x) { int lra = x / 2 - 1; int rra = x / 2; int ps = lra; i64 sm = 0; for (int i = 0; i < x; i ++) { sm += abs(a[i] - a[ps]); } if (sm <= b) { return true; } for (; ps < n - rra; ps ++) { int pps = ps - 1; sm -= abs(a[pps - lra] - a[pps]); // delete leftmost sm -= abs(a[pps] - a[ps]); // delete new ps sm -= (rra - 1); // distance to right decreases sm += abs(a[pps] - a[ps]); // add previous ps sm += (lra - 1); // distance to left increases sm += abs(a[ps + rra] - a[ps]); // add rightmost if (sm <= b) { return true; } } return false; } int besthub(int R, int L, int X[], long long B) { int le, ri; le = 0, ri = R + 1; for (int i = 0; i < R; i ++) { a[i] = X[i]; } b = B; n = R; while (1 < ri - le) { int mi = le + (ri - le) / 2; bool b = (mi % 2) ? che(mi) : chee(mi); if (b) { le = mi; } else { ri = mi; } } return le; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...