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\n",ans);
    return 0;
}

转载于:https://www.cnblogs.com/xzz_233/p/jzoj5341.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值