2018/5/6
http://codeforces.com/contest/975/problem/C
Valhalla Siege
题意:n的士兵,每个士兵有一些生命值,有q次询问,每次询问从前向后造成ki点贯穿伤害(生命值归零的士兵死去,后续士兵承受溢出伤害),问每次询问有几个士兵还活着。当所有士兵死去时,不继续造成溢出伤害并且所有士兵复活。
思路:二分搜索,对士兵生命值求前缀和,每次询问造成的伤害累计,记为s,用upper_bound来寻找前缀和中大于s的第一个人的位置i,n-i就是剩下的人数,如果剩下的人数为0(死完了),就全部复活,s清0。
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int MAX_N = 200000 + 8; 5 ll x[MAX_N]; 6 ll sum[MAX_N]; 7 int main() 8 { 9 int i,n,q; 10 cin >> n >> q; 11 12 memset(sum,0x3f,sizeof(sum)); 13 for(i=0;i<n;i++){ 14 cin >> x[i]; 15 if(i) 16 sum[i]=sum[i-1]+x[i]; 17 else 18 sum[i]=x[i]; 19 } 20 ll s=0,tmp; 21 for(i=0;i<q;i++){ 22 cin >> tmp; 23 s+=tmp; 24 int index=upper_bound(sum,sum+MAX_N,s)-sum; 25 if(n-index<=0) 26 { 27 s=0; 28 index=0; 29 } 30 cout << n-index << "\n"; 31 } 32 return 0; 33 }