zoukankan      html  css  js  c++  java
  • hdu_4046_Panda(树状数组)

    题目连接: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:
    ",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
    ");continue;}
                    if(y-x==2){if(a[x]=='w'&&a[x+1]=='b'&&a[x+2]=='w')printf("1
    ");else printf("0
    ");}
                    else printf("%d
    ",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;
    }
    View Code
  • 相关阅读:
    [Luogu P4779] 单源最短路径(标准版)
    [Luogu P1659] 拉拉队排练
    [Luogu P3435] OKR-Periods of Words
    [Poj #2127] Greatest Common Increasing Subsequence
    [Poj #2019] Cornfields
    [Poj #1949] Chores
    关于我
    划水记录
    [AGC006C] Rabbit Exercise
    [AGC007C] Pushing Balls
  • 原文地址:https://www.cnblogs.com/bin-gege/p/5696185.html
Copyright © 2011-2022 走看看