弹飞绵羊TLE80,

P3203 [HNOI2010] 弹飞绵羊

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int to[200510],len[200510],sum[200510],a[200510]; struct part{int l,r;}k[200510]; int main(){ int n,m,siz=450,left=1,right=450,q,inp,x,y; scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=n;i++){ k[i].l=left,k[i].r=right; if(i==right)left=i+1,right=right+450; } for(int i=n;i>=1;i--){ if(k[i+a[i]].l!=k[i].l)sum[i]=1; else sum[i]=sum[i+a[i]]+1; } for(int i=n;i>=1;i--){ if(k[i].l!=k[i+a[i]].l) {if(!a[i+a[i]])to[i]=-1;else to[i]=i+a[i];} else to[i]=to[i+a[i]]; } scanf("%d",&q); for(int i=1;i<=q;i++){ scanf("%d",&inp); if(inp==1){ scanf("%d",&x);x++; long long ans=0; for(int j=x;j!=-1;j=to[j]){ ans+=sum[j]; } printf("%lld\n",ans); } if(inp==2){ scanf("%d%d",&x,&y); x++; a[x]=y; if(x+a[x]>k[x].r){ to[x]=x+a[x]; sum[x]=1; } else{ to[x]=to[x+a[x]]; sum[x]=sum[x+a[x]]+1; } for(int j=x-1;j>=k[x].l;j--){ if(j+a[j]>k[x].r){ continue; } else{ to[j]=to[j+a[j]]; sum[j]=sum[j+a[j]]+1; } } } } }
by Djangle162857 @ 2019-02-19 21:04:57


```cpp #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int to[200510],len[200510],sum[200510],a[200510]; struct part{int l,r;}k[200510]; int main(){ int n,m,siz=450,left=1,right=450,q,inp,x,y; scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=n;i++){ k[i].l=left,k[i].r=right; if(i==right)left=i+1,right=right+450; } for(int i=n;i>=1;i--){ if(k[i+a[i]].l!=k[i].l)sum[i]=1; else sum[i]=sum[i+a[i]]+1; } for(int i=n;i>=1;i--){ if(k[i].l!=k[i+a[i]].l) {if(!a[i+a[i]])to[i]=-1;else to[i]=i+a[i];} else to[i]=to[i+a[i]]; } scanf("%d",&q); for(int i=1;i<=q;i++){ scanf("%d",&inp); if(inp==1){ scanf("%d",&x);x++; long long ans=0; for(int j=x;j!=-1;j=to[j]){ ans+=sum[j]; } printf("%lld\n",ans); } if(inp==2){ scanf("%d%d",&x,&y); x++; a[x]=y; if(x+a[x]>k[x].r){ to[x]=x+a[x]; sum[x]=1; } else{ to[x]=to[x+a[x]]; sum[x]=sum[x+a[x]]+1; } for(int j=x-1;j>=k[x].l;j--){ if(j+a[j]>k[x].r){ continue; } else{ to[j]=to[j+a[j]]; sum[j]=sum[j+a[j]]+1; } } } } } ```
by Djangle162857 @ 2019-02-19 21:06:25


请不要用 **_Markdown_** 强调头文件的重要性…… 希望更丰富的展现?使用[Markdown](https://www.luogu.org/wiki/show?name=%E5%B8%AE%E5%8A%A9%EF%BC%9Amarkdown)
by Kuriyama_Mirai @ 2019-02-19 21:07:31


|