# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
294859 | 2020-09-09T10:04:24 Z | shrek12357 | 쌀 창고 (IOI11_ricehub) | C++14 | 0 ms | 0 KB |
#include <iostream> #include <vector> #include <algorithm> #include <string> #include <map> #include <set> #include <climits> #include <cmath> #include <fstream> #include <queue> #include "ricehub.h" using namespace std; bool tern(int lo, int hi, long long pre[], long long b, int s1, int s2) { if (hi - lo == 1) { long long val1 = pre[hi + 1] - pre[hi] - pre[lo + 1] + pre[lo]; return val1 <= b; } while (hi >= lo) { int mid1 = lo + (hi - lo) / 3; int mid2 = hi - (hi - lo) / 3; long long val1 = pre[s2 + 1] - pre[mid1 + 1] - (s2- mid1)*(pre[mid1 + 1] - pre[mid1]) + (mid1 - s1)*(pre[mid1 + 1] - pre[mid1]) - pre[mid1] + pre[s1]; long long val2 = pre[s2 + 1] - pre[mid2 + 1] - (s2 - mid2)*(pre[mid2 + 1] - pre[mid2]) + (mid2 - s1)*(pre[mid2 + 1] - pre[mid2]) - pre[mid2] + pre[s1]; if (val1 <= b || val2 <= b) { return true; } if (val1 < val2) { hi = mid2 - 1; } else if (val1 > val2) { lo = mid1 + 1; } else { lo = mid1 + 1; hi = mid2 - 1; } } return false; } bool check(int r, int mid, long long pre[], long long b) { if (mid == 0) { return true; } for (int i = mid - 1; i < r; i++) { if (tern(i - (mid - 1), i, pre, b, i - (mid - 1), i)) { return true; } } return false; } long long besthub(int r, int l, int x[], long long b) { long long lo = 0; long long hi = r; long long best = 0; long long pre[r + 1]; pre[0] = 0; for (int i = 0; i < r; i++) { pre[i + 1] = pre[i] + x[i]; } while (hi >= lo) { long long mid = (hi + lo) / 2; if (check(r, mid, pre, b)) { best = max(best, mid); lo = mid + 1; } else { hi = mid - 1; } } //cout << best << endl; return best; }