比赛 防止浮躁的小练习v0.2 评测结果 AAAAAAAAAAAAAAAAAAAAA
题目名称 贴海报 最终得分 100
用户昵称 NewBee 运行时间 2.981 s
代码语言 C++ 内存使用 162.43 MiB
提交时间 2016-10-08 09:06:33
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<queue>
#define Cu fclose(stdin);fclose(stdout);return 0;
#define Begin freopen("ha14d.in","r",stdin);freopen("ha14d.out","w",stdout); chul();Cu
using namespace std;
const int maxn=10000010;
int tree[maxn<<1];
int ls[maxn],rs[maxn];
bool flag[maxn];
int tim,cnt,s,t,root,ans;
priority_queue <int,vector<int>,greater<int> > q;
void mem(){
	memset(tree,0,sizeof(tree));
	memset(ls,0,sizeof(ls));
	memset(rs,0,sizeof(rs));
	memset(flag,0,sizeof(flag));
	cnt=tim=root=ans=0;
}
void build(){
	root=1;
	tim=1;
}
void update(int rt){
	if(tree[rt]==0)return;
	if(ls[rt]){
		tree[ls[rt]]=tree[rt];
	}
	if(rs[rt]){
		tree[rs[rt]]=tree[rt];
	}
}
void adds(int rt,int l,int r){
	if(s<=l&&t>=r){
		tree[rt]=cnt;
		return;
	}
	if(!ls[rt]){
		ls[rt]=++tim;
	}
	if(!rs[rt]){
		rs[rt]=++tim;
	}
	update(rt);
	int mid=(l+r)>>1;
	if(t<=mid){
		if(!ls[rt]){
			ls[rt]=++tim;
			adds(ls[rt],l,mid);
		}
		else{
			adds(ls[rt],l,mid);
		}
	}
	else if(s>mid){
		if(!rs[rt]){
			rs[rt]=++tim;
			adds(rs[rt],mid+1,r);
		}
		else{
			adds(rs[rt],mid+1,r);
		}
	}
	else{
		if(!rs[rt]){
			rs[rt]=++tim;
			adds(rs[rt],mid+1,r);
		}
		else{
			adds(rs[rt],mid+1,r);
		}
		if(!ls[rt]){
			ls[rt]=++tim;
			adds(ls[rt],l,mid);
		}
		else{
			adds(ls[rt],l,mid);
		}
	}
	tree[rt]=0;
}	
void dfs(){
	while(!q.empty()){
		int rt=q.top();q.pop();
		if(tree[rt]){
			if(!flag[tree[rt]]){
				ans++;
				flag[tree[rt]]=1;
			}
			continue;
		}
		if(ls[rt]){
			q.push(ls[rt]);
		}
		if(rs[rt]){
			q.push(rs[rt]);
		}
	}
}	
void clean(){
	mem();
	int n=maxn-5;
	build();
	int m;scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		cnt++;
		scanf("%d%d",&s,&t);
		adds(root,1,n);
	}
	q.push(root);
	dfs();
	printf("%d\n",ans);
}
void chul(){
	clean();
}
int main(){
	Begin;
}