离散化做法:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
struct node{
int x,y;
}p[maxn];
int tmp[maxn*2];
map<int,int> mp;
bool vis[maxn*2];
int main(){
ios::sync_with_stdio(false);cin.tie(0);
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>p[i].x>>p[i].y;
tmp[2*i]=p[i].x;
tmp[2*i+1]=p[i].y;
}
sort(tmp,tmp+n*2);
int len=unique(tmp,tmp+n*2)-tmp;
for(int i=0;i<len;i++){
mp[tmp[i]]=i+1;
}
int ans=n;
for(int i=n-1;i>=0;i--){
p[i].x=mp[p[i].x];
p[i].y=mp[p[i].y];
int num=0;
for(int j=p[i].x;j<=p[i].y;j++){
if(!vis[j]) vis[j]=1;
else num++;
}
if(num==p[i].y-p[i].x+1) ans--;
}
cout<<ans<<endl;
return 0;
}
线段树+离散化 标程
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
struct node{
int x,y;
}p[maxn];
int tmp[maxn*2];
map<int,int> mp;
struct point{
int l,r;
bool cover;
}tree[maxn*8]; //点数的四倍,即线段树的八倍
void build(int i,int l,int r){
tree[i].l=l;
tree[i].r=r;
tree[i].cover=false;
if(l==r) return ;
int mid=l+r>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
}
bool post(int i,int l,int r){
if(tree[i].cover) return false;
if(tree[i].l==l&&tree[i].r==r){
tree[i].cover=true;
return true;
}
bool ans;
int mid=tree[i].l+tree[i].r>>1;
if(r<=mid) ans=post(i<<1,l,r);
else if(l>mid) ans=post(i<<1|1,l,r);
else{
bool b1=post(i<<1,l,mid);
bool b2=post(i<<1|1,mid+1,r);
ans=b1||b2;
}
if(tree[i<<1].cover&&tree[i<<1|1].cover)
tree[i].cover=true;
return ans;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>p[i].x>>p[i].y;
tmp[2*i]=p[i].x;
tmp[2*i+1]=p[i].y;
}
sort(tmp,tmp+n*2);
int len=unique(tmp,tmp+n*2)-tmp;
for(int i=0;i<len;i++){
mp[tmp[i]]=i+1;
}
build(1,1,len);
int ans=0;
for(int i=n-1;i>=0;i--){
if(post(1,mp[p[i].x],mp[p[i].y])) ans++;
}
cout<<ans<<endl;
return 0;
}