记录编号 316665 评测结果 AAAAAAAAAAAAAA
题目名称 线段覆盖 最终得分 100
用户昵称 GravatarLOSER 是否通过 通过
代码语言 C++ 运行时间 1.754 s
提交时间 2016-10-07 06:21:20 内存使用 15.55 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 200010
int n,m,type;
struct Tree{
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define mid  ((l+r)>>1)
#define lc (rt<<1)
#define rc (rt<<1|1)
#define MAX(a,b) (a>b?a:b)
#define MIN(a,b) (a<b?a:b)
	int Max[maxn<<2],Min[maxn<<2],lazy[maxn<<2],R[maxn<<2],L[maxn<<2];
	void Update(int rt){
		int data=lazy[rt];
		Min[rc]+=data; Max[rc]+=data;
		lazy[rc]+=data; lazy[lc]+=data;
		Min[lc]+=data; Max[lc]+=data;
		R[lc]+=data; R[rc]+=data; L[lc]+=data; L[rc]+=data;
		lazy[rt]=0;
	}
	void Insert(int s,int t,int rt,int l,int r){
		if(s<=l && t>=r){
			int data=0;
			if(type==1)data=1; if(type==2)data=-1;
			lazy[rt]+=data; Min[rt]+=data; Max[rt]+=data;
			R[rt]+=data; L[rt]+=data;	
			return ;
		}	
	
		if(lazy[rt])Update(rt);
		if(s<=mid)Insert(s,t,lson);
		if(t>mid) Insert(s,t,rson);
		Min[rt]=MIN(Min[lc],Min[rc]); Max[rt]=MAX(Max[lc],Max[rc]);
		R[rt]=R[rc]; L[rt]=L[lc];
	}
	int Querycon(int rt,int l,int r){
		if(Min[rt]>=1)return 1;
		if(Max[rt]==0)return 0;
		int ans=0; if(lazy[rt])Update(rt);
		ans+=Querycon(lson)+Querycon(rson);
		if(R[lc] && L[rc])ans--;
		return ans;	
	}
	int Querysum(int rt,int l,int r){
		if(Min[rt]>=1)return r-l+1;
		if(Max[rt]==0)return 0;
		if(lazy[rt])Update(rt);
		return 	Querysum(lson)+Querysum(rson);
	}
}T;
int main(){
	freopen("xdfg.in","r",stdin); freopen("xdfg.out","w",stdout);
	scanf("%d%d",&n,&m);
	while ( m-- ){
		int s,t;scanf("%d%d%d",&type,&s,&t);
		t+=s-1; T.Insert(s,t,1,1,n); 
		printf("%d ",T.Querycon(1,1,n));
		printf("%d\n",T.Querysum(1,1,n));
	}
	return 0;	
}