Ivar 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.
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 i-th minute.
5 5
1 2 1 2 1
3 10 1 1 1
3
5
4
4
3
4 4
1 2 3 4
9 1 10 6
1
4
4
1
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
题意:你有n个士兵,每个士兵的生命值为
ki,如果在某一轮中士兵全部死光了,那么在这一轮结束的时候就会全部复活,且这一轮攻击剩下的伤害就会被忽略,问你每轮攻击结束后你会有多少个士兵。
题解:对n个士兵的生命值记一下前缀和,每轮攻击的时候用upper_bound找一下前缀和里第一个大于
题目:
Ivar 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 q(1≤n,q≤200 000) — the number of warriors and the number of minutes in the battle.
The second line contains a1,a2,…,an(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
5 5
1 2 1 2 1
3 10 1 1 1
- 1
- 2
- 3
output
3
5
4
4
3
- 1
- 2
- 3
- 4
- 5
input
4 4
1 2 3 4
9 1 10 6
- 1
- 2
- 3
output
1
4
4
1
- 1
- 2
- 3
- 4
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.
题意:
你有n个士兵,每个士兵的生命值为ki,如果在某一轮中士兵全部死光了,那么在这一轮结束的时候就会全部复活,且这一轮攻击剩下的伤害就会被忽略,问你每轮攻击结束后你会有多少个士兵。
思路:
对n个士兵的生命值记一下前缀和,每轮攻击的时候用upper_bound找一下前缀和里第一个大于n - cur + 1个士兵。
(用前缀和的思想把多次的伤寒换算为一次,这样使用二分的时候就简单很多了)
ac代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std; typedef long long ll; const int maxn = int(2e5) + 7; ll a[maxn], k[maxn], sum[maxn], dmg; int main() { int n, q; scanf("%d%d", &n, &q); for (int i = 1; i <= n; i++) scanf("%lld", a + i), sum[i] = sum[i - 1] + a[i]; for (int i = 1; i <= q; i++) scanf("%lld", k + i); for (int turn = 1, cur; turn <= q; turn++)
{ dmg += k[turn]; if (dmg >= sum[n]) dmg = 0, printf("%d\n", n); else printf("%d\n", n - int(std::upper_bound(sum + 1, sum + 1 + n, dmg) - sum - 1)); } return 0; }