cdq分治20分求助
查看原帖
cdq分治20分求助
737864
Masterwei楼主2023/7/7 11:24
#include<bits/stdc++.h>
#define re register
#define int long long
using namespace std;
const int Maxn=1e5+5;
int ans;
int n,a[Maxn],b[Maxn];
map<int,int>pd;
int x[Maxn],y[Maxn];
int vis[Maxn];
int t[Maxn];
const int mod=1e9+7;
inline void add(int x,int d){
	while(x<=n){t[x]=(t[x]+d)%mod;x+=x&-x;}
}
inline int query(int x){
	int res=0;
	while(x){res=(res+t[x])%mod;x-=x&-x;}
	return res;
}
inline void memtree(int x){
	while(x<=n){t[x]=0;x+=x&-x;}
}
void cdq(int l,int r){
	if(l==r)return;
	int mid=(l+r)>>1;
	cdq(l,mid);cdq(mid+1,r);
	int n1=0,n2=0;
	for(int i=l;i<=mid;i++)
		if(!vis[a[i]])x[++n1]=a[i],vis[a[i]]=1;
	for(int i=l;i<=mid;i++)
		vis[a[i]]=0;
	for(int i=mid+1;i<=r;i++)
		if(!vis[a[i]])y[++n2]=a[i],vis[a[i]]=1;
	for(int i=mid+1;i<=r;i++)
		vis[a[i]]=0;
	for(int i=1;i<=n1;i++)add(x[i],query(x[i]-1)+1);
	for(int i=1;i<=n2;i++)ans=(ans+query(y[i]-1))%mod;
	for(int i=1;i<=n1;i++)memtree(x[i]);
}
signed main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]),b[i]=a[i];
	sort(b+1,b+1+n);
	int m=unique(b+1,b+1+n)-b;
	for(int i=1;i<m;i++)pd[b[i]]=i;
	for(int i=1;i<=n;i++)a[i]=pd[a[i]];
	cdq(1,n);
	printf("%d",ans);
	return 0;
}

2023/7/7 11:24
加载中...