显示原始代码
#include <iostream>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#define ll long long
using namespace std;
struct Mon {
long long rank, gift;
};
bool cmp(Mon a, Mon b) {
if (a.rank != b.rank)
return a.rank < b.rank;
else
return a.gift >= b.gift;
}
ll n, m;
ll sum[80010];
Mon mon[200005];
int main(void) {
sum[1] = 1;
sum[2] = 2;
for (int i = 3; i <= 80000; ++i) {
if (i & 1)
sum[i] = (1 + i / 2) * (i / 2) + (i + 1) / 2;
else
sum[i] = (1 + i / 2) * (i / 2);
}
scanf("%lld", &n);
for (long i = 0; i < n; i++) {
scanf("%lld", &mon[i].rank);
}
for (long i = 0; i < n; i++) {
scanf("%lld", &mon[i].gift);
}
sort(&mon[0], &mon[n], cmp);
long long min = mon[0].rank + 1, abl = mon[0].rank + 1, add = 0;
for (long i = 0; i < n; i++) {
if (abl <= mon[i].rank) {
min = mon[i].rank - add + 1;
abl = mon[i].rank + 1;
}
abl += mon[i].gift;
add += mon[i].gift;
}
scanf("%lld", &m);
ll x;
for (int i = 1; i <= m; i++) {
scanf("%lld", &x);
if (x >= min)
printf("0 ");
else {
ll need = min - x;
ll l = 0, r = 70000;
while (l + 1 != r) {
ll mid = (l + r) / 2;
if (sum[mid] < need)
l = mid;
else
r = mid;
}
printf("%lld ", r);
}
}
return 0;
}