树状数组解逆序对

158 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

每次按顺序将序列依次加入树状数组d[x]中,d[x]表示当前1到x中有多少数出现,每次加入的时候判断已有的比加入的数大的数。

添加:

因为数x会对比它小的数做出贡献,因而应该往下更改树状数组。

void add(int x)
{
	while(x >= 1)
	{
		d[x]++;
		x -= lowbit(x);
	}
}

查询

从数x开始一直网上累加,算出当前已有的数中比x-1大的数的个数。

int ask(int x)
{
	int ans = 0;
	while(x <= n)
	{
		ans += d[x];
		x += lowbit(x);
	}
	return ans;
}