记录编号 232028 评测结果 AAAAAAAAAAAAAA
题目名称 线段覆盖 最终得分 100
用户昵称 GravatarSky_miner 是否通过 通过
代码语言 C++ 运行时间 2.624 s
提交时间 2016-02-28 16:38:30 内存使用 13.02 MiB
显示代码纯文本
#include<cstdio>
#define T(a,b) a=b=1
#define F(a,b) a=b=0
struct Node{
	int l,r,L,R;
	bool coverleft,coverright;
	int len,count,nub;
	int connect;//左右区间是否连接
}G[400000];
int line,n,cnt;
void Build(int root,int l,int r){
	G[root].l=l;G[root].r=r;
	F(G[root].coverleft,G[root].coverright);
	F(G[root].count,G[root].len);
	F(G[root].nub,G[root].connect);
	if(l<r-1){	
		int mid=(l+r)>>1;
		cnt++; G[root].L=cnt;
		Build(cnt,l,mid);
		cnt++; G[root].R=cnt;
		Build(cnt,mid,r);
	}
	else G[root].L=G[root].R=-1;
}
void update(int root){
	//update len
	if(G[root].count>0) G[root].len = G[root].r-G[root].l;
	else if(G[root].L!=-1) G[root].len= G[ G[root].L ].len + G[ G[root].R ].len;
	else G[root].len=0;
	//update coverleft and coverright
	if(G[root].count>0) T(G[root].coverleft,G[root].coverright);
	else if(G[root].L!=-1){
			G[root].coverleft = G[ G[root].L ].coverleft;
			G[root].coverright= G[ G[root].R ].coverright;
	}
	else F(G[root].coverleft,G[root].coverright);
	//update connect
	if(G[root].L !=-1 ){
		if(G[G[root].R].coverleft && G[G[root].L].coverright) G[root].connect=1;
		else G[root].connect=0;
	}
	else G[root].connect=0;
	//update nub
	if(G[root].count>0) G[root].nub=1;
	else  G[root].nub = G[G[root].L].nub + G[G[root].R].nub - G[root].connect;//if connect then nub--
}
void add(int root,int a,int b){
	if(root==-1) return;
	if(a<= G[root].l && G[root].r<=b) G[root].count++;
	else{
		if(b <=G[root].l || G[root].r <=a) return;
		add(G[root].L,a,b);add(G[root].R,a,b);
	}
	update(root);
}
void del(int root,int a,int b){
	if(root==-1)return;
	if( a<= G[root].l && G[root].r <=b)G[root].count--;
	else{
		if(b<=G[root].l||G[root].r<=a) return;
		del(G[root].L,a,b);del(G[root].R,a,b);
	}
	update(root);
}
void read(int &x){
	x=0;char ch;
	while(ch=getchar(),ch<'!');
	while(x=x*10+ch-'0',ch=getchar(),ch>'!');
	return;
}
int main(){
	freopen("xdfg.in","r",stdin);
	freopen("xdfg.out","w",stdout);
	read(line);read(n);
	//scanf("%d%d",&line,&n);
	Build(0,0,line);
	int x,y,type;
	for(int i=1;i<=n;i++){
		read(type);read(x);read(y);
		//scanf("%d%d%d",&type,&x,&y);
		if(type==1) add(0,x,x+y);
		if(type==2) del(0,x,x+y);
		printf("%d %d\n",G[0].nub,G[0].len);
	}
	return 0;
}