uva 1428 - Ping pong

原创 2013年12月06日 10:59:20
树状数组初级用法:
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <vector>
#include <cstring>
#include <algorithm>

#define INF 0x3fffffff
#define inf -0x3f3f3f3f
#define N 50010
#define M 100010
#define LL long long
#define mod 95041567

using namespace std;

int n, MAX;
int arr[N], d[M], p[N], q[N];

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

int sum(int x){
    int s = 0;
    while(x > 0){
        s += d[x];
        x -= lowbit(x);
    }
    return s;
}

void add(int x){
    while(x <= MAX){
        ++ d[x];
        x += lowbit(x);
    }
}

int main() {
    //freopen("in.txt", "r", stdin);
    int n, t;
    scanf("%d", &t);
    while(t --){
        scanf("%d", &n);
        MAX = 0;
        for(int i = 0; i < n; ++ i){
            scanf("%d", &arr[i]);
            MAX = max(MAX, arr[i]);
            p[i] = q[i] = 0;
        }
        memset(d, 0, sizeof(d));
        for(int i = 0; i < n; ++ i){
            add(arr[i]);
            p[i] = sum(arr[i] - 1);
        }
        memset(d, 0, sizeof(d));
        for(int i = n - 1; i >= 0; -- i){
            add(arr[i]);
            q[i] = sum(arr[i] - 1);
        }
        LL cnt = 0;
        for(int i = 0; i < n; ++ i){
            cnt += (LL)p[i] * (n - i - 1 - q[i]) + (LL)(i - p[i]) * q[i];
        }
        //cout<< cnt <<endl;
        printf("%lld\n", cnt);
    }
    return 0;
}

相关文章推荐

UVa 1428 - Ping pong

题目:从一串数字中选出三个有序的三元组,问有多少种取法。 分析:数据结构,树状数组。利用树状数组求每个数字两侧大和小的数字的个数为线性。             ①按照插入顺序求解data[i]左...

Uva 1428 Ping pong (树状数组,Fenwick树)

N(3N20000) ping pong players live along a west-east street(consider the street as a line segment)....

uva 1428 Ping pong (树状数组)

题意: 一条街道上有N个选手,他们要打乒乓球赛,每个人有一个z

Beijing 2008 / UVa 1428 / POJ 3928 / HDU 2492 Ping pong (树状数组)

Ping pong http://poj.org/problem?id=3928;http://acm.hdu.edu.cn/showproblem.php?pid=2492 Time Li...

UVa:1428 Ping pong (树状数组)

如果之前做过树状数组求逆序数那再做这道题就很轻松了。 枚举以每个人为裁判,有两种情况,左边的人值比裁判小右边的人比裁判大,左边的人值比裁判大右边的人值比裁判大。左右两边相乘,两种情况相加就是答案。第一...
  • kkkwjx
  • kkkwjx
  • 2013年11月07日 19:41
  • 522

UVA1428 Ping pong(树状数组)

UVA1428 Ping pong 一条大街上住着n个乒乓球爱好者,他们经常组织乒乓球比赛且每个人的能力值ai都不同.每次比赛需要2个比赛者和一个裁判,他们有一个奇怪的规定:当裁判的那个人必须住在这两...

uva1428 Ping pong

树状数组
  • sdfzyhx
  • sdfzyhx
  • 2016年11月14日 14:54
  • 125

LA 4329 Ping Pong 2008 北京区域赛 H , BIT 二叉索引树(树状数组)的应用

题目地址: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem...

LA4329 Ping pong 树状数组前缀和

bit中存到考虑a[i]为止,区间上数字的出现的个数,为的是回来统计[1, a[i] - 1]大小范围的数 考虑到第i个人做裁判,设从a[1]到a[i - 1]有c[i]个比a[i]小的数,...

HDU2492 Ping pong 树状数组求逆序数

树状数组求逆序数 转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents Problem Description N(3...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:uva 1428 - Ping pong
举报原因:
原因补充:

(最多只允许输入30个字)