zoj5341 捕老鼠
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zoj5341 捕老鼠相关的知识,希望对你有一定的参考价值。
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
1 #include<queue> 2 #include<cstdio> 3 #include<iostream> 4 #include<algorithm> 5 #include <cstring> 6 #include <string.h> 7 #include <cmath> 8 #include <math.h> 9 #define ll long long 10 #define N 500005 11 #define db double 12 #define P putchar 13 #define G getchar 14 #define mo 1000000007 15 using namespace std; 16 char ch; 17 void read(int &n) 18 { 19 n=0; 20 ch=G(); 21 while((ch<‘0‘ || ch>‘9‘) && ch!=‘-‘)ch=G(); 22 ll w=1; 23 if(ch==‘-‘)w=-1,ch=G(); 24 while(‘0‘<=ch && ch<=‘9‘)n=n*10+ch-‘0‘,ch=G(); 25 n*=w; 26 } 27 28 int max(int a,int b){return a>b?a:b;} 29 int min(int a,int b){return a<b?a:b;} 30 31 void write(int x) 32 { 33 if(x>9) write(x/10); 34 P(x%10+‘0‘); 35 } 36 37 struct node 38 { 39 int x,l,r; 40 }t[4*N]; 41 42 int n,f[N],a[N],opl,opr,x,opx,ops; 43 44 void make(int x,int l,int r) 45 { 46 t[x].l=l;t[x].r=r; 47 t[x].x=2147483647; 48 if(l==r)return; 49 int m=(l+r)/2; 50 make(x+x,l,m); 51 make(x+x+1,m+1,r); 52 } 53 54 void work(int x) 55 { 56 if(t[x].l>=opl && t[x].r<=opr) 57 { 58 if(opx==1)t[x].x=min(t[x].x,ops); 59 if(opx==2)ops=min(ops,t[x].x); 60 return; 61 } 62 if(t[x].l==t[x].r)return; 63 int m=(t[x].l+t[x].r)/2; 64 if(opl<=m)work(x+x); 65 if(m<opr)work(x+x+1); 66 67 t[x].x=min(t[x+x].x,t[x+x+1].x); 68 } 69 70 int main() 71 { 72 freopen("cat.in","r",stdin); 73 freopen("cat.out","w",stdout); 74 read(n); 75 for(int i=1;i<=n;i++) 76 { 77 read(x); 78 if(i+x<=n)a[i+x]=max(a[i+x],2*x+1);else a[n]=max(a[n],n-(i-x)+1); 79 } 80 81 memset(f,127,sizeof(f)); 82 83 make(1,1,n); 84 for(int i=1;i<=n;i++) 85 { 86 opl=i-a[i];opr=i-1; 87 if(opl<=0)f[i]=1; 88 else 89 { 90 ops=f[i]-1; 91 opx=2; 92 if(opl<=opr)work(1); 93 f[i]=ops+1; 94 } 95 ops=f[i];opx=1; 96 opl=opr=i; 97 work(1); 98 } 99 100 write(f[n]); 101 }
以上是关于zoj5341 捕老鼠的主要内容,如果未能解决你的问题,请参考以下文章