hdu 4046 树状数组

#include<stdio.h>
#include<string.h>
#define N  51000
char s[N];
int a[N],n;
int number(int x) {
return x&-x;
}
void creat(int x,int k) {
int i;
for(i=x;i<=50000;i+=number(i))
   a[i]+=k;
}
int sum(int x) {
int su=0,i;
for(i=x;i>=1;i-=number(i))
su+=a[i];
return su;
}
int suma(int a,int b) {
return sum(b)-sum(a);
}
int main() {
      int t,m,i,j,k,count=0;
 char c;
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&m);
scanf("%s",s+1);
memset(a,0,sizeof(a));
for(i=3;i<=n;i++)
if(s[i-1]=='b'&&s[i]=='w'&&s[i-2]=='w') 
        creat(i,1);
printf("Case %d:\n",++count);
while(m--) {
scanf("%d",&i);
if(i==0)  {
scanf("%d%d",&j,&k);
j++;k++;
if(j+1>=k)
printf("0\n");
else
printf("%d\n",suma(j+1,k));
}
else {
scanf("%d %c",&j,&c);
j++;
if(s[j]==c)
continue;
if(s[j-1]=='b'&&s[j]=='w'&&s[j-2]=='w')//将没有改变前,如果与这个字符有关系可以变成一个love就要减一
 creat(j,-1);
if(s[j-1]=='w'&&s[j]=='b'&&s[j+1]=='w')
creat(j+1,-1);
if(s[j]=='w'&&s[j+1]=='b'&&s[j+2]=='w')
creat(j+2,-1);
s[j]=c;
if(s[j-1]=='b'&&s[j]=='w'&&s[j-2]=='w')//改变后,如果与这个字符有关系可以变成一个love的话加一
 creat(j,1);
if(s[j-1]=='w'&&s[j]=='b'&&s[j+1]=='w')
creat(j+1,1);
if(s[j]=='w'&&s[j+1]=='b'&&s[j+2]=='w')
creat(j+2,1);
}
}
}


return 0;
}
posted @ 2014-03-25 14:45  HYDhyd  阅读(89)  评论(0编辑  收藏  举报