zoukankan      html  css  js  c++  java
  • BZOJ 1230: [Usaco2008 Nov]lites 开关灯

    线段树裸题

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int n,q,sz0[1000005],sz1[1000005],rev[1000005];
    void update(int t){
    	sz0[t]=sz0[t<<1]+sz0[t<<1|1];
    	sz1[t]=sz1[t<<1]+sz1[t<<1|1];
    }
    void push_down(int t){
    	rev[t<<1]^=1,rev[t<<1|1]^=1;
    	swap(sz0[t<<1],sz1[t<<1]),swap(sz0[t<<1|1],sz1[t<<1|1]);
    	rev[t]^=1;
    }
    void modify_rev(int t,int l,int r,int x,int y){
    	if (r<x || l>y) return;
    	if (l>=x && r<=y){
    		rev[t]^=1;
    		swap(sz0[t],sz1[t]);
    		return;
    	}
    	if (rev[t]) push_down(t);
    	int mid=(l+r)>>1;
    	modify_rev(t<<1,l,mid,x,y);
    	modify_rev(t<<1|1,mid+1,r,x,y);
    	update(t);
    }
    int query(int t,int l,int r,int x,int y){
    	if (r<x || l>y) return 0;
    	if (l>=x && r<=y) return sz1[t];
    	if (rev[t]) push_down(t);
    	int mid=(l+r)>>1;
    	return query(t<<1,l,mid,x,y)+query(t<<1|1,mid+1,r,x,y);
    }
    void build(int t,int l,int r){
    	if (l==r){
    		sz0[t]=1;
    		return;
    	}
    	int mid=(l+r)>>1;
    	build(t<<1,l,mid);
    	build(t<<1|1,mid+1,r);
    	update(t);
    }
    int main(){
    	scanf("%d%d",&n,&q);
    	build(1,1,n);
    	while (q--){
    		int cas,l,r;
    		scanf("%d%d%d",&cas,&l,&r);
    		if (!cas) modify_rev(1,1,n,l,r);
    		else printf("%d
    ",query(1,1,n,l,r));
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    POJ 1611 The Suspects 并查集
    POJ A Simple Problem with Integers 线段树的成段更新
    POJ 2367 Genealogical tree 拓扑排序
    《大道至简》读后感
    周总结报告
    周学习进度总结
    周总结报告
    周总结报告
    周总结报告
    教室派评价
  • 原文地址:https://www.cnblogs.com/silenty/p/9900742.html
Copyright © 2011-2022 走看看