zoukankan      html  css  js  c++  java
  • 洛谷——P2574 XOR的艺术

    P2574 XOR的艺术

    很久之前就想挑战一下这道题了,线段树下传标记的入门题,跟区间加法下传标记类似。

    #include<bits/stdc++.h>
    #define N 1000005
    #define LL long long
    #define RE register
    #define IN inline
    
    using namespace std;
    
    IN void in(int &x){
        int flg=1;RE char ch=getchar();x=0;
        for(;ch>'9'||ch<'0';){if(ch=='-') flg=-1;ch=getchar();}
        for(;ch<='9'&&ch>='0';ch=getchar()) x=x*10+ch-'0';
        x*=flg;
    }
    
    struct node{
        int l,r,w,f;
    }tr[N];
    int n,m,ans,X,tot;
    int e[N];
    
    IN void build(int k,int l,int r){
        tr[k].l=l;tr[k].r=r;
        if(l==r){
            tr[k].w=e[l];
            return;
        }int mid=(l+r)/2;
        build(k*2,l,mid);build(k*2+1,mid+1,r);
        tr[k].w=tr[k*2].w+tr[k*2+1].w;
    }
    
    IN void down(int k){
        tr[k].f^=1;
        tr[k*2].w=(tr[k*2].r-tr[k*2].l+1)-tr[k*2].w;
        tr[k*2+1].w=(tr[k*2+1].r-tr[k*2+1].l+1)-tr[k*2+1].w;
        tr[k*2].f^=1;
        tr[k*2+1].f^=1;
    }
    
    IN void ask_interval(int k,int l,int r){
        int ll=tr[k].l,rr=tr[k].r,mid=(ll+rr)/2;
        if(ll>=l&&rr<=r){
            ans+=tr[k].w;
            return;
        }if(tr[k].f) down(k);
        if(l<=mid) ask_interval(k*2,l,r);
        if(r>mid) ask_interval(k*2+1,l,r);
        tr[k].w=tr[k*2].w+tr[k*2+1].w;
    }
    
    IN void change_interval(int k,int l,int r){
        int ll=tr[k].l,rr=tr[k].r,mid=(ll+rr)/2;
        if(ll>=l&&rr<=r){
            tr[k].w=(rr-ll+1)-tr[k].w;
            tr[k].f^=1;
            return;
        }if(tr[k].f) down(k);
        if(l<=mid) change_interval(k*2,l,r);
        if(r>mid) change_interval(k*2+1,l,r);
        tr[k].w=tr[k*2].w+tr[k*2+1].w;
    }
    
    int main()
    {
        in(n);in(m);
        for(int i=1;i<=n;i++)
            scanf("%1d",&e[i]);
        build(1,1,n);
        while(m--){
            int p,l,r;
            in(p);in(l);in(r);
            if(p==0){
                change_interval(1,l,r);
            }else {
                ans=0,ask_interval(1,l,r);
                printf("%d
    ",ans);
            }
        }return 0;
    }
  • 相关阅读:
    SQL Server 百万级数据提高查询速度的方法(转)
    sql优化的几种方法
    MyBatis中调用存储过程和函数
    android ipc通信机制之二序列化接口和Binder
    APK的目录结构
    android Handler错误,不同的包Handler
    BaiduMap开发,获取公交站点信息。
    GitHub托管项目步骤
    Mysql,JDBC封装
    简单工厂模式练习
  • 原文地址:https://www.cnblogs.com/song-/p/9610356.html
Copyright © 2011-2022 走看看