CF- 975C 字首和二分
阿新 • • 發佈:2019-01-05
解題思路:
假設此時在射擊到第i個勇士那麼就可以用sum[i-1]+這個時刻的箭數量去二分查詢第一個大於它的字首和位置,這個位置就是接下來要到達的勇士位置.sum[i]表示位置i的字首和。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int mx = 2e5 + 10; int n,m; ll a[mx],b[mx],sum[mx]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%I64d",a+i),sum[i] = sum[i-1] + a[i]; for(int i=1;i<=m;i++) scanf("%I64d",b+i); ll remain = 0; int pos = 0; for(int i=1;i<=m;i++){ if(remain>b[i]){ remain -= b[i]; printf("%d\n",n-pos+1); }else{ int k = upper_bound(sum+pos+1,sum+n+1,b[i]-remain+sum[pos]) - sum; if(k==n+1){ remain = pos = 0; printf("%d\n",n); }else{ remain = sum[k] - (b[i]-remain+sum[pos]); pos = k; printf("%d\n",n-pos+1); } } } return 0; }