https://acm.uestc.edu.cn/problem/ren-zai-di-shang-zou-guo-cong-tian-shang-lai/description
将点当成左闭右开的线段,然后每次查是否有位置填,也就是一个点维护和一个线段维护就可以了
#include <bits/stdc++.h> using namespace std; const int maxn= 1e5+9; int res[maxn]; int flag; struct rt{ int x,y; int nx,ny; }a[maxn]; int b[maxn*2]; struct xx{ int sum,ls,rs; int lazy; }dat[maxn*8]; int dd[maxn*8]; int dian[maxn*8]; int dianlazy[maxn*8]; int lazy[maxn*8]; void pushUpS(int k){ if(dat[k<<1].rs&&dat[k<<1|1].ls){ dat[k].sum=dat[k<<1].sum+dat[k<<1|1].sum-1; } else{ dat[k].sum=dat[k<<1].sum+dat[k<<1|1].sum; } dat[k].rs=dat[k<<1|1].rs; dat[k].ls=dat[k<<1].ls; } void pushUpd(int k){ dian[k]=dian[k<<1]+dian[k<<1|1]; } void pushUp(int k){ dd[k]=dd[k<<1]+dd[k<<1|1]; } void pushDown(int k,int l,int r){ int mid=(l+r)>>1; dd[k<<1]=mid-l+1; dd[k<<1|1]=r-mid; lazy[k<<1]=lazy[k<<1|1]=1; lazy[k]=0; } void updata(int a,int b,int l,int r,int k){ if(a<=l&&r<=b){ dd[k]=r-l+1;lazy[k]=1;return; } if(lazy[k])pushDown(k,l,r); int mid=(l+r)>>1; if(a<=mid)updata(a,b,l,mid,k<<1); if(b>mid)updata(a,b,mid+1,r,k<<1|1); pushUp(k); } int query(int a,int b,int l,int r,int k){ if(a<=l&&r<=b)return dd[k]; if(lazy[k])pushDown(k,l,r); int mid=(l+r)>>1; int ans=0; if(a<=mid)ans+=query(a,b,l,mid,k<<1); if(b>mid)ans+=query(a,b,mid+1,r,k<<1|1); return ans; } void updataS(int a,int b,int l,int r,int k){ if(dat[k].lazy)return; if(a<=l&&r<=b){ dat[k].sum=1; dat[k].ls=dat[k].rs=1; dat[k].lazy=1; return ; } int mid=(l+r)>>1; if(a<=mid)updataS(a,b,l,mid,k<<1); if(b>mid)updataS(a,b,mid+1,r,k<<1|1); pushUpS(k); } void updatad(int a,int b,int l,int r,int k,int x){ if(dianlazy[k])return; if(a<=l&&r<=b){ dian[k]=x; if(x==0)dianlazy[k]=1; return; } int mid=(l+r)>>1; if(a<=mid)updatad(a,b,l,mid,k<<1,x); if(b>mid)updatad(a,b,mid+1,r,k<<1|1,x); pushUpd(k); } int main(){ ios::sync_with_stdio(false); int n;cin>>n; int tt=0; for(int i=1;i<=n;i++){ cin>>a[i].x>>a[i].y; b[++tt]=a[i].x; b[++tt]=a[i].y; } sort(b+1,b+1+tt); int num=unique(b+1,b+1+tt)-(b+1); for(int i=1;i<=n;i++){ a[i].nx=lower_bound(b+1,b+1+num,a[i].x)-b; a[i].ny=lower_bound(b+1,b+1+num,a[i].y)-b; } int ans=0; for(int i=1;i<=n;i++){ int x=query(a[i].nx,a[i].ny,1,num,1); updata(a[i].nx,a[i].ny,1,num,1); if(a[i].nx!=a[i].ny){ updataS(a[i].nx,a[i].ny-1,1,num,1); updatad(a[i].nx,a[i].ny,1,num,1,0); } if(x==0){ ans++; if(a[i].nx==a[i].ny){ updatad(a[i].nx,a[i].nx,1,num,1,1); } } else{ ans=dat[1].sum+dian[1]; } res[i]=ans; } for(int i=1;i<=n;i++){ cout<<res[i]; if(i<n)cout<<" "; else cout<<endl; } return 0; }