您的位置:首页 > 其它

Codeforces 892B Wrath 【差分】

2017-11-19 14:08 411 查看
题目链接:http://codeforces.com/contest/892/problem/B

题外话:

前几天的noip考炸了,成绩出来的时候再补游记吧。

期中考考的还行,三大主科350轻松混到rk2

发现了许多问题,希望自己今后不再出现吧。

sro scb hyw orz

题意:

有一个数列 L[] ,对于任意一个人i,在同一时间,他可以干掉他前面的L[i]个人,问最后有多少个人活着。

题解:

最初想到用一个数组记录活的人,发现会炸,发现区间修改,果断上差分,差分会在 O(n)的时间复杂度内统计出有哪些人活着。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map> // STL
#include <string>
#include <vector>
#include <queue>
#include <stack&
4000
gt;
#define mpr make_pair
#define debug() puts("okkkkkkkk")

using namespace std;

typedef long long LL;

const int inf = 1 << 26;

int n;
int L[1000005];
int cf[1000005],af[1000005];

int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&L[i]);
for(int i=n;i>=1;i--){
int now=L[i];   //[max(0,i-now),i-1]
--cf[max(1,i-now)]; ++cf[i];
}
int ans=0;
af[1]=cf[1];
if(af[1]==0)++ans;
for(int i=2;i<=n;i++){
af[i]=af[i-1]+cf[i];
if(af[i]==0)++ans;
}
printf("%d\n",ans);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: