poj 3928

来源:互联网 发布:js 给div添加右键事件 编辑:程序博客网 时间:2024/05/19 18:42
#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<vector>#include<map>#include<set>#include<stack>#include<queue>#include<algorithm>#include<utility>#include<sstream>#include<iostream>using namespace std;const int MAX=20010,M=100110;#define ll long long intll a[MAX],x[M],f[MAX],r[MAX],lowbit[M];void add(int k){     //向上更新    while(k<M){        x[k]++;        k+=lowbit[k];    }}ll sum(int k){     //求前缀和    ll s=0;    while(k>0){        s+=x[k];        k-=lowbit[k];    }    return s;}int main(){ //   freopen("in.in","r",stdin);    int i,t,n;    for(i=1;i<M;i++) lowbit[i]=i&-i;    scanf("%d",&t);    while(t--){        scanf("%d",&n);        for(i=0;i<n;i++) scanf("%d",&a[i]);        memset(x,0,sizeof(x));        for(i=0;i<n;i++){            f[i]=sum(a[i]-1);  //查找之前能力值比第i个人小的人数                               add(a[i]);//更新树        }        memset(x,0,sizeof(x));  //同样的过程        for(i=n-1;i>=0;i--){            r[i]=sum(a[i]-1);            add(a[i]);        }        ll ans=0;        for(i=0;i<n;i++){            ans+=(f[i]*(n-i-1-r[i])+r[i]*(i-f[i]));        }        printf("%lld\n",ans);    }    return 0;}

0 0
原创粉丝点击