夜遊 ECNU

題目鏈接:夜遊 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章