C. Valhalla Siege
time limit per test
2 secondsmemory limit per test
256 megabytesinput
standard inputoutput
standard outputIvar the Boneless is a great leader. He is trying to capture Kattegat from Lagertha. The war has begun and wave after wave Ivar's warriors are falling in battle.
Ivar has (i−1)-th warrior. The first warrior leads the attack.
Each attacker can take up to i-th warrior's strength.
Lagertha orders her warriors to shoot t.
The battle will last for q minutes, after each minute you should tell Ivar what is the number of his standing warriors.
Input
The first line contains two integers 1≤n,q≤200000) — the number of warriors and the number of minutes in the battle.
The second line contains 1≤ai≤109) that represent the warriors' strengths.
The third line contains ki arrows will attack the warriors.
Output
Output i-th minute.
Examples
input
Copy
5 5
1 2 1 2 1
3 10 1 1 1
output
3
5
4
4
3
input
4 4
1 2 3 4
9 1 10 6
output
1
4
4
1
Note
In the first example:
- after the 1-st minute, the 1-st and 2-nd warriors die.
- after the 2-nd minute all warriors die (and all arrows left over are wasted), then they will be revived thus answer is 5 — all warriors are alive.
- after the 3-rd minute, the 1-st warrior dies.
- after the 4-th minute, the 2-nd warrior takes a hit and his strength decreases by 1.
- after the 5-th minute, the 2-nd warrior dies.
这题其实就是一个前缀和二分查找。
1 #include <cstdio> 2 #include <algorithm> 3 #include <vector> 4 #include <queue> 5 #include <cstring> 6 #include <string> 7 using namespace std; 8 const int maxn = 2e5 + 10; 9 long long a[maxn], b[maxn], sum[maxn], sum1[maxn]; 10 int main() { 11 long long n, q; 12 while(scanf("%lld%lld", &n, &q) != EOF) { 13 sum[0] = 0; 14 for (long long i = 1 ; i <= n ; i++) { 15 scanf("%lld", &a[i]); 16 sum[i] = sum[i - 1] + a[i]; 17 } 18 for (long long i = 1 ; i <= q ; i++) { 19 scanf("%lld", &b[i]); 20 } 21 long long temp = 0, cnt, ret = 0; 22 for (long long i = 1 ; i <= q ; i++) { 23 cnt = upper_bound(sum + 1, sum + n + 1, sum[temp] + b[i] + ret) - sum - 1; 24 ret = a[cnt + 1] - (sum[cnt + 1] - sum[temp] - b[i] - ret); 25 if (ret == a[cnt + 1]) ret = 0; 26 temp = cnt; 27 if (temp == n ) { 28 temp = 0; 29 ret = 0; 30 } 31 printf("%lld\n", n - temp); 32 } 33 } 34 return 0; 35 }