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;
    } 
    
  • 相关阅读:
    LeetCode Best Time to Buy and Sell Stock II
    LeetCode Best Time to Buy and Sell Stock
    LeetCode Word Break
    LeetCode Climbing Stairs
    LeetCode Minimum Path Sum
    LeetCode N-Queens II
    LeetCode N-Queens
    LeetCode Minimum Cost For Tickets
    用mybatis生成插件自动生成配置文件
    log4j.properties文件的配置
  • 原文地址:https://www.cnblogs.com/For-Miku/p/13623571.html
Copyright © 2011-2022 走看看