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

    Miku

    对于线段树来讲,lazy的更新是一个要仔细考虑的问题

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstring>
    using namespace std;
    int n,m;
    int sum[1200005],lazy[1200005];
    int k;int l,r;
    char x;
    void pushdown(int x,int l,int r){
    	if(lazy[x]!=0){
    		int mid=(l+r)>>1;
    		lazy[x<<1]^=1;
    		lazy[x<<1|1]^=1;
    		sum[x<<1]=(mid-l+1)-sum[x<<1];
    		sum[x<<1|1]=(r-mid)-sum[x<<1|1];
    		lazy[x]=0;
    	}
    	return ; 
    }
    void pushup(int x){
    	sum[x]=sum[x<<1]+sum[x<<1|1];
    	return ; 
    }
    void update(int x,int l,int r,int L,int R){
    	if(L<=l&&r<=R){
    		lazy[x]^=1;
    		sum[x]=(r-l+1)-sum[x];
    		return ; 
    	}
    	int mid=(l+r) >>1;
    	pushdown(x,l,r);
    	if(L<=mid) update(x<<1,l,mid,L,R);
    	if(R>mid) update(x<<1|1,mid+1,r,L,R);
    	pushup(x);
    }
    int query(int x,int l,int r,int L,int R){
    	if(L<=l&&r<=R){
    		return sum[x];
    	}
    	int mid=(l+r) >>1;
    	pushdown(x,l,r);
    	int ans=0;
    	if(L<=mid) ans+=query(x<<1,l,mid,L,R);
    	if(R>mid) ans+=query(x<<1|1,mid+1,r,L,R);
    	return ans;
    }
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;++i){
    		cin>>x;
    		x-=48;
    		k=x; 
    		if(k)
    		update(1,1,n,i,i);	
    	}
    	for(int i=1;i<=m;++i){
    		scanf("%d",&k);
    		scanf("%d%d",&l,&r);
    		if(k==0){
    			update(1,1,n,l,r);
    		}else{			
    			cout<<query(1,1,n,l,r)<<endl;
    			 
    		}
    	}
    	return 0;
    } 
    
  • 相关阅读:
    mysql复习相关
    OpenStack三种类型的NAT转换
    openstack资料相关
    [转]Web 调试工具之 Advanced REST client
    [转]Aspose.Words.dll 将 Word 转换成 html
    [Android] 开发第十天
    [win10]遇坑指南
    [转]Explorer.exe的命令行参数
    [Android] 开发第九天
    [Android] 开发第八天
  • 原文地址:https://www.cnblogs.com/For-Miku/p/13623571.html
Copyright © 2011-2022 走看看