UKE求助
查看原帖
UKE求助
546301
Suite_No1_G楼主2023/4/11 22:18

RT

#include<bits/stdc++.h>
using namespace std;
#define int long long

const int maxn=1e6+10;
int a[maxn];
int t[maxn];
int l[maxn],r[maxn];
map<int,int> mp;

int lowbit(int x){
	return x&(-x);
}

int sum1[maxn],sum2[maxn];

int n,m;
void modify(int i,int sum[]){
	while (i<=m){
		sum[i]++;
		i+=lowbit(i); 
	}
}

int query(int i,int sum[]){
	int ans=0;
	while (i>=1){
		ans+=sum[i];
		i-=lowbit(i);
	}
	
	return ans;
}

signed main(){
	scanf("%lld",&n);
	for (int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		t[i]=a[i];
	}
	
	sort(t+1,t+1+n);
	m=unique(t+1,t+1+n)-(t+1);
	for (int i=1;i<=m;i++) mp[t[i]]=i;
	for (int i=1;i<=n;i++) a[i]=mp[a[i]]; 
	
	for (int i=1;i<=n;i++){
		l[i]=query(m,sum1)-query(a[i],sum1);
		modify(a[i],sum1);
	}
	
	for (int i=n;i>=1;i--){
		r[i]=query(a[i]-1,sum2);
		modify(a[i],sum2);
	}
	
	int ans=0;
	
	for (int i=2;i<n;i++){
		ans+=l[i]*r[i];
	}
	
	printf("%lld\n",ans);
	return 0;
}
2023/4/11 22:18
加载中...