#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; void Rd(int&res){ res=0;char c; while(c=getchar(),c<48); do res=res*10+(c&15); while(c=getchar(),c>47); } const int N=250001; int n,num[N],tmp[N]; struct Segment_Tree{ struct node{ int L,R,mi; }tree[N<<2]; void pushup(int p){ tree[p].mi=min(tree[p<<1].mi,tree[p<<1|1].mi); } void build(int L,int R,int p){ tree[p].L=L,tree[p].R=R; if(L==R){ tree[p].mi=num[L]; return; } int mid=L+R>>1; build(L,mid,p<<1); build(mid+1,R,p<<1|1); pushup(p); } int query(int L,int R,int p){ if(tree[p].L==L&&tree[p].R==R){ return tree[p].mi; } int mid=tree[p].L+tree[p].R>>1; if(R<=mid)return query(L,R,p<<1); else if(L>mid)return query(L,R,p<<1|1); else return min(query(L,mid,p<<1),query(mid+1,R,p<<1|1)); } }T; #include<vector> vector<int>h[N]; int main(){ Rd(n); for(int i=1,a;i<=n;i++){ Rd(a),Rd(num[i]); tmp[i]=num[i]; } sort(tmp+1,tmp+1+n); int len=unique(tmp+1,tmp+1+n)-tmp-1; for(int i=1;i<=n;i++) num[i]=lower_bound(tmp+1,tmp+1+len,num[i])-tmp; T.build(1,n,1); for(int i=1;i<=n;i++) h[num[i]].push_back(i); int ans=n; for(int i=1;i<=len;i++){ for(int j=1;j<h[i].size();j++){ int pre=h[i][j-1],cur=h[i][j]; if(T.query(pre,cur,1)<i)continue; ans--; } } printf("%d\n",ans); return 0; }
|