比赛 |
防止浮躁的小练习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;
}