CF练习记录

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 }
View Code

猜你喜欢

转载自www.cnblogs.com/bestefforts/p/8997640.html