# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1241200 | CodeLakVN | Rice Hub (IOI11_ricehub) | C++17 | 0 ms | 0 KiB |
#include "ricehub.h"
#include <bits/stdc++.h>
using namespace std;
#define task "main"
#define no "NO"
#define yes "YES"
#define F first
#define S second
#define vec vector
#define _mp make_pair
#define ii pair<int, int>
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define evoid(val) return void(std::cout << val)
#define FOR(i, a, b) for(int i = (a); i <= (b); ++i)
#define FOD(i, b, a) for(int i = (b); i >= (a); --i)
const int MAX_N = (int)1e5 + 5;
int numField, maxCoor;
long long limit;
int x[MAX_N];
long long pre[MAX_N];
bool check(int val) {
FOR(r, val, numField) {
int l = r - val + 1;
int mid = (r + l) / 2;
long long sumL = pre[mid] - pre[l - 1], sumR = pre[r] - pre[mid];
int cntL = mid - l + 1, cntR = r - mid;
if (1LL * x[mid] * cntL - sumL + sumR - 1LL * x[mid] * cntR <= limit) {
// cout << "LEN: " << val << ": " << l << " - " << r << ", MID = " << mid << ": TRUE\n";
// cout << sumL << ", " << sumR << " | " << 1LL * x[mid] * cntL - sumL << ", " << sumR - 1LL * x[mid] * cntR << "\n";
return true;
}
}
return false;
}
int process() {
pre[0] = 0;
FOR(i, 1, numField) pre[i] = pre[i - 1] + 1LL * x[i];
int l = 1, r = numField, res = 0;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) l = (res = mid) + 1;
else r = mid - 1;
}
return res;
}
int besthub(int R, int L, long long B, int coor[]) {
numField = R, maxCoor = L, limit = B;
FOR(i, 0, numField - 1) x[i + 1] = coor[i];
return process();
}
/* Lak lu theo dieu nhac!!!! */