算法竞赛进阶指南,205页,树状数组
本题要点:
1、利用树状数组求逆序数, 顺序数:
以求 “V” 子图腾为例子, Right[i]表示 a[i] 的后面有几个数比它大, Left[i]表示a[i]前面有几个数比它大
a) 倒叙扫描数组a,利用树状数组去除每个a[i] 后边有几个数比它大, 记为 Right[i]
b) 顺序扫描数组a,利用树状数组去除每个a[i] 前面边有几个数比它大, 记为 Left[i]
答案就是 sum{Right[i] * Left[i]}, 1 <= i <= n
#include <cstdio>
#include <cstring>
#include <iostream>
#define lowbit(i) ((i)&(-i))
using namespace std;
const int MaxN = 200010;
long long a[MaxN], c[MaxN], Left[MaxN], Right[MaxN];
// Right[i]表示 a[i] 的后面有几个数比它大, Left[i]表示a[i]前面有几个数比它大
int n;
long long getSum(int x)
{
long long sum = 0;
for(int i = x; i > 0; i -= lowbit(i))
{