UVALive 4329 Ping pong—树状数组

版权声明:欢迎大家转载,转载请注明出处 https://blog.csdn.net/hao_zong_yin/article/details/82466684

将近一年没用树状数组了,回顾一下。。。

另外udebug的数据是错的

#include <bits/stdc++.h>
using namespace std;
const int maxn = 200000 + 10;
int t, n, m, a[maxn], C[maxn], l[maxn], r[maxn];
inline int lowbit(int x) { return x & (-x); }
int sum(int x) {
    int ret = 0;
    while (x > 0) { ret += C[x]; x -= lowbit(x); }
    return ret;
}
void add(int x, int d) {
    while (x < maxn) { C[x] += d; x += lowbit(x); }
}
int main() {
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n);
        m = 0;
        memset(C, 0, sizeof(C));
        for (int i = 1; i <= n; i++) scanf("%d", &a[i]), m = max(m, a[i]);
        for (int i = 1; i <= n; i++) {
            l[i] = sum(a[i]);
            add(a[i], 1);
        }
        memset(C, 0, sizeof(C));;
        for (int i = n; i >= 1; i--) {
            r[i] = sum(a[i]);
            add(a[i], 1);
        }
        long long ans = 0;
        for (int i = 1; i <= n; i++) {
            ans += (long long)l[i] * (n-i-r[i]) + (long long)(i-l[i]-1)*r[i];
        }
        printf("%lld\n", ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hao_zong_yin/article/details/82466684