題目鏈接:夜遊 ECNU
顯然有一個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;
}