大意:求逆序数
分析:数据较小,可以用树状数组。数据大则用归并。用树状数组求逆序数时,数组tree代表数字x是否在序列中出现过,如果数字x已经存在于序列中,则tree[x]=1,否则tree[x]=0,此时query(x)返回值为在序列中比数字x小的元素的个数,如果序列中第i个元素的值为x,那么前i个元素中比x大的元素的个数为i-query(x)。
代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int n, tree[1005]; int lowbit(int i) { return i&(-i); } void update(int i, int x) { while (i <= n) { tree[i] += x; i = i + lowbit(i); } } int query(int n) { int sum = 0; while (n > 0) { sum += tree[n]; n = n - lowbit(n); } return sum; } int main() { while (scanf("%d", &n) != EOF&&n) { int a, ans = 0; memset(tree, 0, sizeof(tree)); for (int i = 1; i <= n; i++) { scanf("%d", &a); update(a, 1); ans += i - query(a); } printf("%d ", ans); } return 0; }