http://poj.org/problem?id=3928
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 2087 | Accepted: 798 | 
Description
Input
Output
Sample Input
1 3 1 2 3
Sample Output
1
Source
/**
 * @author neko01
 */
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
#include <set>
#include <map>
using namespace std;
typedef long long LL;
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define pb push_back
#define mp(a,b) make_pair(a,b)
#define clr(a) memset(a,0,sizeof a)
#define clr1(a) memset(a,-1,sizeof a)
#define dbg(a) printf("%d\n",a)
typedef pair<int,int> pp;
const double eps=1e-9;
const double pi=acos(-1.0);
const int INF=0x3f3f3f3f;
const LL inf=(((LL)1)<<61)+5;
const int N=20005;
const int M=100005;
int bit[M];
int f[N];
int a[N];
LL sum(int i)
{
    LL s=0;
    while(i>0)
    {
        s+=bit[i];
        i-=i&-i;
    }
    return s;
}
void add(int i,int x)
{
    while(i<=M)
    {
        bit[i]+=x;
        i+=i&-i;
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        clr(bit);
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            f[i]=sum(a[i]);
            add(a[i],1);
        }
        clr(bit);
        LL ans=0;
        for(int i=n-1;i>=0;i--)
        {
            int x=sum(a[i]);
            int y=n-i-1-x;
            ans+=(LL)(f[i]*y);
            ans+=(LL)((i-f[i])*x);
            add(a[i],1);
        }
        printf("%lld\n",ans);
    }
    return 0;
}原文:http://www.cnblogs.com/hrhguanli/p/4515173.html