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

本文介绍了一种使用树状数组高效计算逆序对数量的方法。相较于传统的O(n^2)和归并排序O(nlogn)算法,此方法不仅时间复杂度低,而且代码简洁易懂。通过具体的代码实现,展示了如何利用树状数组的add和query操作来快速统计逆序对。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

逆序对在编程中比较常见,最普通的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应该都看得懂,毕竟是树状数组经典操作。实现过程就画个图就解决了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值