hdu_4046_Panda(树状数组)

来源:互联网 发布:中羽信誉好的淘宝店 编辑:程序博客网 时间:2024/04/29 09:50

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4046

题意:一大堆篇幅介绍,跳过直奔主题,让你寻找给定区间的“wbw”的个数。

题解:直接上树状数组,改变字符后对应改变3个值就行,注意的是询问 [l,r],应该对应输出的是[l+1,r]。因为sum[l+1]记录了a[l-1],a[l],a[l+1]。

#include<cstdio>const int maxn=50001;int tree[maxn],n;char a[maxn];void fre(){freopen("c:\\acm\\input.txt","r",stdin);}inline void add(int x,int v){for(;x<=n;x+=x&-x)tree[x]+=v;}inline int ask(int x){int an=0;for(;x;x-=x&-x)an+=tree[x];return an;}void change(int x,char y){int cg[3],after[3];for(int i=0;i<=2;i++){if(x+i-2<1)cg[i]=0;else if(a[x+i-2]=='w'&&a[x+i-1]=='b'&&a[x+i]=='w')cg[i]=1;else cg[i]=0;}a[x]=y;for(int i=0;i<=2;i++){if(x+i-2<1)after[i]=0;else if(a[x+i-2]=='w'&&a[x+i-1]=='b'&&a[x+i]=='w')after[i]=1;else after[i]=0;}for(int i=0;i<=2;i++){int kk=after[i]-cg[i];if(kk!=0)add(x+i,kk);}}int main(){//fre();int t,ic=1,m,cmd;scanf("%d",&t);while(t--){printf("Case %d:\n",ic++);scanf("%d%d",&n,&m);scanf("%s",a+1);for(int i=1;i<=n;i++)tree[i]=0;for(int i=3;i<=n;i++)if(a[i]=='w'&&a[i-1]=='b'&&a[i-2]=='w')add(i,1);for(int i=1;i<=m;i++){scanf("%d",&cmd);if(cmd==0){int x,y;scanf("%d%d",&x,&y);x++,y++;if(y-x<2){printf("0\n");continue;}if(y-x==2){if(a[x]=='w'&&a[x+1]=='b'&&a[x+2]=='w')printf("1\n");else printf("0\n");}else printf("%d\n",ask(y)-ask(x+1));}else{int x;char y[2];scanf("%d%s",&x,y);x++;if(a[x]==y[0])continue;else change(x,y[0]);}}}return 0;}

0 0
原创粉丝点击