zoukankan      html  css  js  c++  java
  • hdu4339Query

    这题是线段树+二分。。

    先代码贴上,忘记了好看。。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define MAXN 1000050
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    using namespace std;
    char str1[MAXN];
    char str2[MAXN];
    int str[MAXN];
    int sum[MAXN<<2];
    int que;
    int len;
    void pushup(int rt){
        sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    }
    void build(int l,int r,int rt){
        if(l==r){
            sum[rt]=str[l];
            return;
        }
        int m=(l+r)>>1;
        build(lson);
        build(rson);
        pushup(rt);
    }
    void update(int p,int val,int l,int r,int rt){
        if(l==r&&l==p){
            sum[rt]+=val;
            return;
        }
        int m=(l+r)>>1;
        if(p<=m)update(p,val,lson);
        else update(p,val,rson);
        pushup(rt);
    }
    int query(int L,int R,int l,int r,int rt){
        if(L<=l&&R>=r){
            return sum[rt];
        }
        int m=(l+r)>>1;
        int re=0;
        if(L<=m)re+=query(L,R,lson);
        if(R>m)re+=query(L,R,rson);
        return re;
    }
    int main(){
      //  freopen("input.txt","r",stdin);
      //  freopen("1009.out","w",stdout);
        freopen("in.txt","r",stdin);
        int tt;
        scanf("%d",&tt);
        for(int cas=1;cas<=tt;cas++){
            printf("Case %d:\n",cas);
            scanf("%s",str1);
            scanf("%s",str2);
            len=max(strlen(str1),strlen(str2));
            for(int i=0;i<len;i++){
                if(str1[i]==str2[i])
                str[i]=1;
                else str[i]=0;
            }
            build(0,len-1,1);
            scanf("%d",&que);
            while(que--){
                int a;
                scanf("%d",&a);
                if(a==1){
                    int b,c;
                    char d[2];
                    scanf("%d%d%s",&b,&c,d);
                    if(b==1){
                       str1[c]=d[0];
                    }
                    else{
                        str2[c]=d[0];
                    }
                    if(str1[c]==str2[c]&&!str[c]){
                        str[c]=1;
                        update(c,1,0,len-1,1);
                    }
                    else if(str1[c]!=str2[c]&&str[c]){
                        str[c]=1;
                        update(c,-1,0,len-1,1);
                    }
                }
                else{
                    int b;
                    scanf("%d",&b);
                    int l=b,r=len-1;
                    int ans=0;
                    while(l<=r){
                        int mid=(l+r)>>1;
                        int re=query(l,mid,0,len-1,1);
                        if(re==mid-l+1){
                            ans+=re;
                            l=mid+1;
                        }
                        else{
                            r=mid-1;
                        }
                    }
                    printf("%d\n",ans);
                }
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    [WC2010]重建计划
    [POJ1741]Tree
    [NOI2008]志愿者招募
    [BZOJ2127]happiness
    「网络流 24 题」太空飞行计划
    [TJOI2015]线性代数
    [HDU2874]Connections between cities
    [POI2007]ZAP-Queries
    [SCOI2010]幸运数字
    POJ 2826 An Easy Problem?!
  • 原文地址:https://www.cnblogs.com/arbitrary/p/2633023.html
Copyright © 2011-2022 走看看