• HDU 4046 Panda


    线段树单点更新,要注意两段合并多出的答案的计算即可

    //============================================================================
    // Name        : D.cpp
    // Author      : L_Ecry
    // Version     :
    // Copyright   : Your copyright notice
    // Description : Hello World in C++, Ansi-style
    //============================================================================
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include <iostream>
    #define N 50050
    using namespace std;
    int value[N*4];
    char s[N];
    inline int cal(int l,int r,int mid)
    {
    
        int res=0;
        if(mid>l&&s[mid-1]=='w'&&s[mid]=='b'&&s[mid+1]=='w')res++;
        if(mid+1<r&&s[mid]=='w'&&s[mid+1]=='b'&&s[mid+2]=='w')res++;
        return res;
    }
    void build(int l,int r,int i)
    {
        if(l==r)
        {
            value[i]=0;
            return ;
        }
        int mid=(l+r)>>1;
        int lson=(i<<1),rson=(i<<1|1);
        build(l,mid,lson);
        build(mid+1,r,rson);
        value[i]=value[lson]+value[rson]+cal(l,r,mid);
    }
    void update(int l,int r,int p,int i)
    {
        if(l==r)
        {
            return;
        }
        int mid=(l+r)>>1;
        int lson=(i<<1),rson=(i<<1|1);
        if(p<=mid)update(l,mid,p,lson);
        else update(mid+1,r,p,rson);
        value[i]=value[lson]+value[rson]+cal(l,r,mid);
    }
    int query(int l,int r,int pl,int pr,int i)
    {
        if(l==pl&&r==pr)
        {
            return value[i];
        }
        int mid=(l+r)>>1;
        if(pr<=mid)return query(l,mid,pl,pr,i<<1);
        else if(pl>mid)return query(mid+1,r,pl,pr,i<<1|1);
        else
        {
            return query(l,mid,pl,mid,i<<1)+query(mid+1,r,mid+1,pr,i<<1|1)+cal(pl,pr,mid);
        }
    }
    int n,m;
    void init()
    {
        scanf("%d%d",&n,&m);
        scanf(" %s",s+1);
        build(1,n,1);
    }
    void solve()
    {
        while(m--)
        {
            int x,y,z;
            char c;
            scanf("%d%d",&x,&y);
            if(x==0)
            {
                scanf("%d",&z);
                y++;z++;
                printf("%d
    ",query(1,n,y,z,1));
            }
            else
            {
                scanf(" %c",&c);
                y++;
                s[y]=c;
                update(1,n,y,1);
            }
        }
    }
    int main() {
        int tt,ri=0;
        scanf("%d",&tt);
        while(tt--)
        {
            init();
            printf("Case %d:
    ",++ri);
            solve();
        }
        return 0;
    }
  • 相关阅读:
    UVa 541 Error Correction
    UVa 11045 My T-shirt suits me
    【模板】Ford-Fulkerson算法
    POJ 1273 Drainage Ditches
    UVa 10158 War
    UVa 658 It's not a Bug, it's a Feature!
    【模板】并查集
    【模板】Floyd-Warshall算法
    UVa 10034 Freckles
    UVa 10048 Audiophobia
  • 原文地址:https://www.cnblogs.com/L-Ecry/p/3871471.html
Copyright © 2020-2023  润新知