您的位置:首页 > 其它

【模板】逆序对(树状数组)

2018-03-15 10:17 246 查看
逆序对在编程中比较常见,最普通的O(n ^ 2)算法很短,但是太慢了,往往不满足我们的要求。一种高级的O(nlogn)的算法是使用归并排序,在归并排序执行过程中解决问题,时间是短,但是代码量太大了。现在,我们有一种算法,时间短,代码量也少,很好记,就是用树状数组来实现。int n, c[MAXN], number[MAXN];
struct Node { int val, num; } a[MAXN];
bool cmp(Node a, Node b) { return a.val > b.val; }
int lowbit(int x) { return x & (-x); }
void add(int x)
{
for (int i = x;i <= n;i += lowbit(i)) c[i]++;
}
int query(int x)
{
int ans = 0;
for (int i = x;i > 0;i -= lowbit(i)) ans += c[i];
return ans;
}
int reverse_order_pair()
{
int ans = 0, temp = -1, tot = 0;
stable_sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++)
{
if (a[i].val != temp)
{
tot++;
temp = a[i].val;
}
number[a[i].num] = tot;
}
for (int i = 1; i <= n; i++)
{
add(number[i]);
ans += query(number[i] - 1);
}
return ans;
}
revers_order_pair是求解逆序对的函数,compare是为了使用sort,add和query应该都看得懂,毕竟是树状数组经典操作。实现过程就画个图就解决了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: