• 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: ",++count);
    while(m--) {
    scanf("%d",&i);
    if(i==0)  {
    scanf("%d%d",&j,&k);
    j++;k++;
    if(j+1>=k)
    printf("0 ");
    else
    printf("%d ",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;
    }
  • 相关阅读:
    2072=删数问题
    2872=M--二分查找
    4165=全排列问题
    2805=大家快来A水题
    4148=1.1联结词真值运算
    2748=第X大的数
    3479=青蛙过河
    1200=汉诺塔
    Leetcode92_反转链表II
    Leetcode206_反转链表
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410828.html
Copyright © 2020-2023  润新知