UVALIVE 4329 Ping pong

大白上的题目

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <stack>
#include <queue>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <climits>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
using namespace std;
int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
#define MAXN 100010
#define MAXD 20010
int num[MAXN];
int val[MAXD],lmin[MAXD],rmin[MAXD];
int lowbit(int x) {return x & (-x);}
int sum(int x)
{
        int ret = 0;
        while (x > 0)
        {
                ret += num[x];
                x -= lowbit(x);
        }
        return ret;
}
void add(int x,int d)
{
        while (x <= MAXN)
        {
                num[x] += d;
                x += lowbit(x);
        }
}
int main()
{
        int T,n;
        scanf("%d",&T);
        while (T--)
        {
                scanf("%d",&n);
                memset(num,0,sizeof(num));
                for (int i = 1; i <= n ; i++)
                {
                        scanf("%d",&val[i]);
                        add(val[i],1);
                        lmin[i] = sum(val[i] - 1);
                }
                memset(num,0,sizeof(num));
                for (int i = n ; i >= 1 ; i--)
                {
                        add(val[i],1);
                        rmin[i] = sum(val[i] - 1);
                }
                LL ans = 0;
                for (int i = 1; i <= n ; i++)
                        ans += lmin[i] * (n - i - rmin[i]) + (i - lmin[i] - 1) * rmin[i];
                printf("%lld
",ans);
        }
        return 0;
}

  

原文地址:https://www.cnblogs.com/Commence/p/4354438.html