jzoj5341 捕老鼠

Description
为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠。于是,猫被农夫约派去捕老鼠。 猫虽然擅长捕老鼠,但是老鼠们太健美了,身手敏捷,于是猫想到了一个绝妙的办法:它决定点燃纯艾条,用烟熏老鼠。 农夫约的农庄里有N 个仓库,排成了一排,编号为1~N。

假设猫在第i 个仓库点燃艾条,烟雾就会充满该仓库,并向左右扩散Ai的距离,接着所有|i-j|<=Ai 的仓库j 的老鼠被消灭。 猫是一只爱护空气环境的好猫,它希望知道最少需要多少支艾条,才可以消灭所有老鼠。

Input
第一行:一个正整数,代表N。
第二行:N 个非负整数,第i 个数代表Ai。

Output
第一行:一个整数,代表答案。

Sample Input
10
2 0 1 1 0 3 1 0 2 0

Sample Output
3

Hint
Data Constraint

20%的数据:N <= 20
60%的数据:N <= 10^3
100%的数据:N <= 5*10^5,Ai <= N

sb区间覆盖QwQ

cjoj上63ms
好像是最快的了orz

// It is made by XZZ
// Fei Fan Ya Xi Lie~~~
#include<cstdio>
#include<algorithm>
using namespace std;
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
	rg int x=0,f=1;rg char ch=getchar();
	while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
	while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*f;
}
const int maxn=5e5+1;
int a[maxn],mr[maxn];
il vd checkmx(int&a,int b){if(b>a)a=b;}
int main(){
// 	freopen("2605.in","r",stdin);
// 	freopen("2605.out","w",stdout);
	int n=gi();
	for(rg int i=1;i<=n;++i)a[i]=gi();
	for(rg int i=1;i<=n;++i)checkmx(mr[max(1,i-a[i])],i+a[i]);
	for(rg int i=2;i<=n;++i)checkmx(mr[i],mr[i-1]);
	int r=0,ans=0;
	while(r<n)++ans,r=mr[r+1];
	printf("%d
",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/xzz_233/p/jzoj5341.html