P1840 Color the Axis_NOI导刊2011提高(05)

#include<cstdio>
#define MAXN 200005

int n,m;

struct Segment_Tree{
	int c[MAXN<<2],tag[MAXN<<2];
	inline void build(int k,int l,int r){
		if(l==r){
			c[k]=1;
			return;
		}
		int mid=(l+r)>>1;
		build(k<<1,l,mid);
		build(k<<1|1,mid+1,r);
		c[k]=c[k<<1]+c[k<<1|1];
	}
	inline void pushdown(int k,int l,int r){
		if(!tag[k])return;
		int mid=(l+r)>>1;
		c[k<<1]=0;
		tag[k<<1]+=tag[k];
		c[k<<1|1]=0;
		tag[k<<1|1]+=tag[k];
		tag[k]=0;
	}
	inline void modify(int k,int l,int r,int xl,int xr){
		if(xl<=l&&r<=xr){
			c[k]=0;
			tag[k]++;
			return;
		}
		pushdown(k,l,r);
		int mid=(l+r)>>1;
		if(xl<=mid)modify(k<<1,l,mid,xl,xr);
		if(xr>=mid+1)modify(k<<1|1,mid+1,r,xl,xr);
		c[k]=c[k<<1]+c[k<<1|1];
	}
	inline int query(){
		pushdown(1,1,n);//亲测这一行不加也可以
		return c[1];
	}
}T;

int main(){
	scanf("%d%d",&n,&m);
	T.build(1,1,n);
	for(int i=1;i<=m;i++){
		int l,r;
		scanf("%d%d",&l,&r);
		T.modify(1,1,n,l,r);
		printf("%d\n",T.query());
	}
}

我一直以为过了这题我就能写得出来扫描线了...... 加油

(据说还有并查集的写法?)

posted @ 2019-11-04 12:30  Y15BeTa  阅读(126)  评论(0编辑  收藏  举报