uva 1428 - Ping pong

来源:互联网 发布:apache benchmark 编辑:程序博客网 时间:2024/06/06 05:35
树状数组初级用法:
//#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 95041567using 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;}

原创粉丝点击