乱贴小广告是很不好的呀,大家不要学习。。。
一开始还以为这道题可以进行一系列骚操作来解决,之后,想了好久,发现我想不出来233。
不过,反正就是简单的区间操作,直接上线段树就好了。。。
#include<bits/stdc++.h>
#define N 100000
using namespace std;
struct Tree{
long long l;
long long r;
long long ma;
long long cg;
};Tree T[8*N+1];
long long l[N+1],r[N+1],data[2*N+1],tmp,cnt,n,ans;
bool E[N+1];
inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline long long read()
{
long long x=0,b=1;
char c=nc();
for(;!(c<='9'&&c>='0');c=nc())if(c=='-')b=-1;
for(;c<='9'&&c>='0';c=nc())x=x*10+c-'0';
return x*b;
}
inline void write(long long x)
{
if(x==0)putchar('0');
else
{
char buf[15];
long long len=0;
if(x<0)putchar('-'),x=-x;
while(x)buf[++len]=x%10+'0',x/=10;
for(long long i=len;i>=1;i--)putchar(buf[i]);
}
putchar('\n');
}
inline void pushup(long long rt)
{
T[rt].ma=max(T[rt*2].ma,T[rt*2+1].ma);
}
inline void pushdown(int rt)
{
if(T[rt].cg==0)return;
int tmp=T[rt].cg;T[rt].cg=0;
T[rt*2].ma=tmp,T[rt*2].cg=tmp;
T[rt*2+1].ma=tmp,T[rt*2+1].cg=tmp;
}
inline void build(long long rt,long long l,long long r)
{
T[rt].l=l,T[rt].r=r;
if(l==r)return;
long long mid=(l+r)/2;
build(rt*2,l,mid),build(rt*2+1,mid+1,r);
pushup(rt);
}
inline void modify(int rt,int l,int r,int val)
{
pushdown(rt);
if(T[rt].l==l&&T[rt].r==r)
{
T[rt].ma=val;
T[rt].cg=val;
return;
}
int mid=(T[rt].l+T[rt].r)/2;
if(r<=mid)modify(rt*2,l,r,val);
else if(l>mid)modify(rt*2+1,l,r,val);
else modify(rt*2,l,mid,val),modify(rt*2+1,mid+1,r,val);
pushup(rt);
}
inline long long qurry(long long rt,long long l,long long r)
{
pushdown(rt);
if(T[rt].l==l&&T[rt].r==r)return T[rt].ma;
long long mid=(T[rt].l+T[rt].r)/2;
if(r<=mid)return qurry(rt*2,l,r);
else if(l>mid)return qurry(rt*2+1,l,r);
else return max(qurry(rt*2,l,mid),qurry(rt*2+1,mid+1,r));
}
int main()
{
freopen("in.txt","r",stdin);
n=read();build(1,1,2*n);
for(int i=1;i<=n;i++)
{
l[i]=read(),data[++cnt]=l[i];
r[i]=read(),data[++cnt]=r[i];
}
sort(data+1,data+cnt+1);
tmp=unique(data+1,data+cnt+1)-data-1;
for(int i=1;i<=n;i++)
{
l[i]=lower_bound(data+1,data+tmp+1,l[i])-data;
r[i]=lower_bound(data+1,data+tmp+1,r[i])-data;
}
for(int i=1;i<=n;i++)modify(1,l[i],r[i],i);
for(int i=1;i<=2*n;i++)
{
int x=qurry(1,i,i);
if(x==0)continue;
if(!E[x])ans++,E[x]=true;
}
cout<<ans;
return 0;
}
注意,要离散化数据。。。