显示原始代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int a[N], b[N], n, m, lev[N], mlev, ans[N];
int tran(int x) {
if (x & 1) {
int n = x >>= 1;
return n * n + 2 * n + 1;
}
int n = x >>= 1;
return n * n + n;
}
void mergeSort(int a[], int l, int r, int m[]) {
if (l >= r) {
return;
}
int mid = (l + r) / 2;
mergeSort(a, l, mid, m);
mergeSort(a, mid + 1, r, m);
int temp[r + 2], temp2[r + 2], k = 0, h = 0;
int p1 = l, p2 = mid + 1;
while (p1 <= mid && p2 <= r) {
if (a[p1] <= a[p2]) {
temp[k] = a[p1];
temp2[k++] = m[p1++];
} else {
temp[k] = a[p2];
temp2[k++] = m[p2++];
}
}
while (p1 <= mid) {
temp[k] = a[p1];
temp2[k++] = m[p1++];
}
while (p2 <= r) {
temp[k] = a[p2];
temp2[k++] = m[p2++];
}
for (int i = l, j = 0; i <= r; i++, j++) {
a[i] = temp[j];
m[i] = temp2[j];
}
return;
}
signed main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
cin >> b[i];
}
mergeSort(a, 1, n, b);
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += b[i];
lev[i] = a[i] + sum;
}
for (int i = n; i > 1; i--) {
sum -= b[i];
if (lev[i - 1] < a[i]) {
mlev = a[i] - sum;
break;
} else
mlev = a[i - 1];
}
cin >> m;
for (int i = 1; i <= m; i++) {
int atk;
cin >> atk;
int temp = atk, j = 0;
while (1) {
atk = temp;
atk += tran(j);
if (atk > mlev)
break;
j++;
}
ans[i] = j;
}
for (int i = 1; i <= m; i++) {
cout << ans[i] << " ";
}
return 0;
}