#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<map>
using namespace std;
const int MAX_N = 10001;
const int root = 1;
struct node
{
int s,e;
};
struct node p[MAX_N*10];
int wide[MAX_N*10];
struct Treenode
{
int L,R;
int Lid,Rid;
int tag;
};
struct Treenode T[MAX_N*10];
int N;
int M;
int Q;
map<int,int> hash;
int times ;
bool colorp[MAX_N];
void Build(int l,int r)
{
if (l>=r) {T[++times]=(struct Treenode){l,r,-1,-1,0};return;}
int now = ++times;
int mid = (l+r)/2;
int lid= times+1;
Build(l,mid);
int rid= times+1;
Build(mid+1,r);
T[now]=(struct Treenode){l,r,lid,rid,0};
}
void init()
{
int i;
int last;
scanf("%d",&N);
for (i=1;i<=N;i++)
scanf("%d %d",&p[i].s,&p[i].e);
for (i=1;i<=N;i++)
wide[i]=p[i].s,wide[i+N]=p[i].e;
sort(wide+1,wide+N*2+1);
last=wide[1];
M=2*N;
for (i=2;i<=2*N;i++)
{
if (wide[i]-last>1)
wide[++M]=last+1;
last=wide[i];
}
sort(wide+1,wide+M+1);
Q=0;
last=-1;
for (i=1;i<=M;i++)
if (last!=wide[i])
{
last=wide[i];
++Q;
hash[last]=Q;
}
Build(1,Q);
}
void down_tag(int t)
{
if (T[t].tag!=-1)
{
int lid=T[t].Lid;
int rid=T[t].Rid;
T[lid].tag=T[t].tag;
T[rid].tag=T[t].tag;
T[t].tag = 0;
}
}
void change(int t,int s,int e,int color)
{
int l=T[t].L;
int r=T[t].R;
int mid=(l+r)/2;
int lid=T[t].Lid;
int rid=T[t].Rid;
if (s<=l&&e>=r) {T[t].tag=color;return ;}
down_tag(t);
T[t].tag=-1;
if (s<=mid) change(lid,s,e,color);
if (e>mid) change(rid,s,e,color);
}
void work()
{
int i;
for (i=1;i<=N;i++)
{change(root,hash[p[i].s],hash[p[i].e],i);}
}
void query(int t,int s,int e)
{
int l=T[t].L;
int r=T[t].R;
int mid=(l+r)/2;
int lid=T[t].Lid;
int rid=T[t].Rid;
if (T[t].tag!=-1) {colorp[T[t].tag]=true;return ;}
down_tag(t);
T[t].tag=-1;
if (s<=mid) query(lid,s,e);
if (e>mid) query(rid,s,e);
}
void put()
{
int i;
int ans = 0;
query(root,1,Q);
for (i=1;i<=N;i++)
if (colorp[i]) ans++;
printf("%d",ans);
}
int main()
{
freopen("poster.in","r",stdin);
freopen("poster.out","w",stdout);
init();
work();
put();
return 0;
}
poster
最新推荐文章于 2024-08-10 08:21:22 发布