#include <cstdio>
#include <vector>
using namespace std;
typedef long long LL;
bool solve(int left, int all, int games, int& result) {
int A = -1, B = all-left+1;
while (B-A>1) {
int C = (A+B) / 2;
int mid = C;
int right = all-left-mid;
if (LL(left)*mid*right + LL(mid)*(mid-1)/2*(left+right) + LL(mid)*(mid-1)/2*(mid-2)/3 >= games) {
B = C;
} else {
A = C;
}
}
if (A == all-left) return false;
result = B;
return true;
}
void doit() {
int n; scanf("%d", &n);
vector<int> a(n); for (int i=0; i<n; ++i) scanf(" %d", &a[i]);
int A = 0, B = 200010;
while (B-A>1) {
int C = (A+B)/2;
//printf("Trying %d (%d %d)\n", C, A, B);
bool failed = false;
int before = 0;
for (int i=0; i<n; ++i) {
int result;
if (!solve(before, C, a[i], result)) {
failed = true;
//printf("Failed!");
break;
}
//printf("%d, ", result);
before += result;
}
if (failed) {
A = C;
} else {
B = C;
}
//printf("\n");
//printf("Got (%d %d)\n", A, B);
}
printf("%d\n", B);
}
int main() {
int t; scanf(" %d", &t);
while (t--) doit();
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include <cstdio> #include <vector> using namespace std; typedef long long LL; bool solve(int left, int all, int games, int& result) { int A = -1, B = all-left+1; while (B-A>1) { int C = (A+B) / 2; int mid = C; int right = all-left-mid; if (LL(left)*mid*right + LL(mid)*(mid-1)/2*(left+right) + LL(mid)*(mid-1)/2*(mid-2)/3 >= games) { B = C; } else { A = C; } } if (A == all-left) return false; result = B; return true; } void doit() { int n; scanf("%d", &n); vector<int> a(n); for (int i=0; i<n; ++i) scanf(" %d", &a[i]); int A = 0, B = 200010; while (B-A>1) { int C = (A+B)/2; //printf("Trying %d (%d %d)\n", C, A, B); bool failed = false; int before = 0; for (int i=0; i<n; ++i) { int result; if (!solve(before, C, a[i], result)) { failed = true; //printf("Failed!"); break; } //printf("%d, ", result); before += result; } if (failed) { A = C; } else { B = C; } //printf("\n"); //printf("Got (%d %d)\n", A, B); } printf("%d\n", B); } int main() { int t; scanf(" %d", &t); while (t--) doit(); } |
English