显然有一个n*n的dp方程。
但是我们可以按照x排序,之后用fenwick维护y的前缀和,然后计数即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops") #include<bits/stdc++.h> //#define int long long using namespace std; const int N=2e5+10,mod=1e9+7; int n,d[N],m,res[N]; struct node{int x,y,id;}t[N]; vector<int> v; inline int get(int x){return lower_bound(v.begin(),v.end(),x)-v.begin()+2;} inline void insert(int x,int v){for(;x<=m;x+=x&(-x)) d[x]=(d[x]+v)%mod;} inline int ask(int x){int s=0; for(;x;x-=x&(-x)) s=(s+d[x])%mod; return s;} signed main(){ cin>>n; for(int i=1;i<=n;i++) cin>>t[i].x>>t[i].y,v.push_back(t[i].x),v.push_back(t[i].y),t[i].id=i; sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); m=v.size()+1; for(int i=1;i<=n;i++) t[i].x=get(t[i].x),t[i].y=get(t[i].y); sort(t+1,t+1+n,[](node a,node b){return a.x==b.x?a.y<b.y:a.x<b.x;}); insert(1,1); for(int i=1;i<=n;i++){ res[t[i].id]=ask(t[i].y); insert(t[i].y,res[t[i].id]); } for(int i=1;i<=n;i++) printf("%d ",res[i]); return 0; }