现在的位置: 首页 > 综合 > 正文

线段树区间翻转模板

2013年08月29日 ⁄ 综合 ⁄ 共 819字 ⁄ 字号 评论关闭
struct Seg {
	int val[4*N];
	bool rev[4*N];
	void init( int id, int l, int r, int *b ) {
		rev[id]=0;
		if ( l==r ) {
			val[id]=b[l];
			return;
		}
		int m=(l+r)/2;
		init(id*2,l,m,b);
		init(id*2+1,m+1,r,b);
		val[id]=val[id*2]+val[id*2+1];
	}
	int get( int id, int l, int r ) {
		if ( !rev[id] ) return val[id];
		else return (r-l+1)-val[id];
	}
	void push( int id, int l, int r ) {
		if ( !rev[id] ) return;
		rev[id*2]^=1;
		rev[id*2+1]^=1;
		rev[id]=0;
	}
	void pull( int id, int l, int r ) {
		int m=(l+r)/2;
		val[id]=get(id*2,l,m)+get(id*2+1,m+1,r);
	}
	int get( int id, int l, int r, int ql, int qr ) {
		if ( qr<l || ql>r ) return 0;
		if ( ql<=l && r<=qr ) return get(id,l,r);
		push(id,l,r);
		int m=(l+r)/2,ret=0;
		ret+=get(id*2,l,m,ql,qr);
		ret+=get(id*2+1,m+1,r,ql,qr);
		pull(id,l,r);
		return ret;
	}
	void chg( int id, int l, int r, int ql, int qr ) {
		if ( qr<l || ql>r ) return;
		if ( ql<=l && r<=qr ) {
			rev[id]^=1;
			return;
		}
		push(id,l,r);
		int m=(l+r)/2;
		chg(id*2,l,m,ql,qr);
		chg(id*2+1,m+1,r,ql,qr);
		pull(id,l,r);
	}

} seg[22];

抱歉!评论已关闭.