比赛 20200622 评测结果 AAAAAAAAAA
题目名称 三元数对 最终得分 100
用户昵称 数声风笛ovo 运行时间 0.121 s
代码语言 C++ 内存使用 48.93 MiB
提交时间 2020-06-22 20:21:11
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e6+9;
struct node{
    int num,pos;
}qwq[maxn];
int n,cnt;
int sum[maxn],num[maxn],big[maxn],small[maxn];
void add(int root,int l,int r,int x){
    if(l==r&&l==x){
		sum[root]++;
		return;
	}
    int mid=(l+r)>>1;
    if(mid>=x) add(root*2,l,mid,x);
    if(mid<x) add(root*2+1,mid+1,r,x);
    sum[root]=sum[root*2]+sum[root*2+1];
}
ll ask(int root,int l,int r,int gl,int gr){
	ll ans=0;
    if(gl<=l&&r<=gr){
    	return sum[root];
    }
    int mid=(l+r)/2;
    if(mid>=gl) ans+=ask(root*2,l,mid,gl,gr);
    if(mid<gr) ans+=ask(root*2+1,mid+1,r,gl,gr);
    return ans; 
}
bool cmp(node a,node b){
    return a.num<b.num;
}
int main(){
	freopen("three.in","r",stdin);
	freopen("three.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
    	scanf("%d",&qwq[i].num);
		qwq[i].pos=i;
    } 
    sort(qwq+1,qwq+n+1,cmp);
    for(int i=1;i<=n;i++){
        if(qwq[i].num>qwq[i-1].num) cnt++;
        num[qwq[i].pos]=cnt; 
    }
    for(int i=1;i<=n;i++){
        if(num[i]>1) small[i]=ask(1,1,n,1,num[i]-1);
        add(1,1,n,num[i]);
    }
    memset(sum,0,sizeof(sum));
    for(int i=n;i>=1;i--){
        if(num[i]<n) big[i]=ask(1,1,n,num[i]+1,n);
        add(1,1,n,num[i]);
    }
    ll ans=0ll;
    for(int i=1;i<=n;i++) ans+=(big[i]*small[i]);
    printf("%lld",ans);
    return 0;
}