CodeForces 975C Valhalla Siege

Description:

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 nn warriors, he places them on a straight line in front of the main gate, in a way that the i-th warrior stands right after (i−1)-th warrior. The first warrior leads the attack.

Each attacker can take up to ai arrows before he falls to the ground, where aiai is the ii-th warrior's strength.

Lagertha orders her warriors to shoot ki arrows during the i-th minute, the arrows one by one hit the first still standing warrior. After all Ivar's warriors fall and all the currently flying arrows fly by, Thor smashes his hammer and all Ivar's warriors get their previous strengths back and stand up to fight again. In other words, if all warriors die in minute t, they will all be standing to fight at the end of minute 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 n and q (1n,q200000) — the number of warriors and the number of minutes in the battle.

The second line contains nn integers a1,a2,,an(1ai109) that represent the warriors' strengths.

The third line contains q integers k1,k2,,kq (1ki1014), the ii-th of them represents Lagertha's order at the ii-th minute: ki arrows will attack the warriors.

Output

Output q lines, the ii-th of them is the number of standing warriors after the ii-th minute.

Examples
Input
Copy
5 5
1 2 1 2 1
3 10 1 1 1
Output
Copy
3
5
4
4
3
Input
Copy
4 4
1 2 3 4
9 1 10 6
Output
Copy
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. 

題目大意:
直接解釋一下樣例比較好, 題目描述的太囉嗦了看了好幾遍。 第一行是士兵個數和時間, 第二行是每個士兵的血量, 第三行是第i-th分鐘飛來劍的攻擊力。 只要把頭的士兵沒被打死每次箭都會飛向他 , 如果所有士兵全部倒下就會即刻原地復活。 輸出每分鐘結束後還剩下幾個活的士兵。

解題思路:
很明顯的前綴和問題, 看一下數據量暴力尋找大於等於攻擊力的士兵下標會超時, 因爲士兵的血量前綴和是單調的具有二分性質每次跑二分時間就減少非常多。 (一開始手寫二分一直有點問題, 後來放棄用了lower_bound()...)這裏需要注意當射一次箭如果士兵還有血量需要記錄一次。

代碼:
#include <iostream>
#include <sstream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <utility>
#include <string>
#include <cmath>
#include <vector>
#include <bitset>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int dir[9][2] = { 0, 1, 0, -1, 1, 0, -1, 0, 1, 1, 1, -1, -1, 1, -1, -1, 0, 0 };
const int inf = 0x3f3f3f;
const ll ll_inf = (ll) 1e15;
const double pi = acos(-1.0);
const int mod = (ll) 1e9 + 7;
const int Max = (int) 2e5 + 51;
const ld eps = 1e-10;
/*tools:
*ios::sync_with_stdio(false);
*freopen("input.txt", "r", stdin);
*/
int n, q;
ll arr[Max];
int main() {
    scanf("%d %d", &n, &q);
    for (int i = 1; i <= n; ++i) {
        scanf("%lld\n", &arr[i]);
        arr[i] += arr[i - 1];
    }
    ll k, cur = arr[0], pow = 0;
    while (q--) {
        scanf("%lld", &k);
        pow += k;
        if (pow >= arr[n]) {
            printf("%d\n", n);
            pow = 0;
            cur = 0;
            continue;
        }
        int index = lower_bound(arr + 1, arr + n + 1, pow) - (arr);
        cur = arr[index] - pow;
        //cout << pow << " " << index << " " << cur << endl;
        if (cur == 0) {
            printf("%d\n", n - index);
        }
        else {
            printf("%d\n", n - index + 1);
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章