树状数组求逆序对

特殊的离散化处理 特殊的离散化处理 特殊的离散化处理


按照给定数组的大小关系求出它的索引数组
即 索引数组中的val值是原数组第key大的数字所在的下标

#include
#include
#include

using namespace std;

const int N = 1e5;

int n;

int a[N], b[N];

int main()
{
	cin >> n;
	
	for(int i = 1; i <= n; i ++)
	{
		cin >> a[i];
		b[i] = i;
	}
	
	sort(b+1, b+1+n, [](int x, int y){
	return a[x] == a[y] ? x > y : a[x] > a[y];
	});
	
	for(int i = 1; i <= n; i ++)
	{
		printf("%d ", b[i]);
	}
	
	return 0;
}

这样我们就要用索引数组来操作了 这样我们就要用索引数组来操作了 这样我们就要用索引数组来操作了
还是树状数组往常的操作,求和,算逆序对呢,就不能求逆序的了需要求正序对,正序对的个数就是用到树状数组前缀和,比如 5 进去了就求 1 − − 4 的前缀和就是正序对数,最终的正序对数就是逆序对 还是树状数组往常的操作,求和,算逆序对呢,就不能求逆序的了需要求正序对,正序对的个数就是用到树状数组前缀和,比如5进去了就求1--4的前缀和就是正序对数,最终的正序对数就是逆序对 还是树状数组往常的操作,求和,算逆序对呢,就不能求逆序的了需要求正序对,正序对的个数就是用到树状数组前缀和,比如5进去了就求14的前缀和就是正序对数,最终的正序对数就是逆序对

#include
#include
#include

using namespace std;

const int N = 1e5;

int n;

int a[N], b[N], c[N];

int lowbit(int x)
{
	return x & -x;
}

void add(int x)
{
	for(int i = x; i <= n; i += lowbit(i))
	{
		c[i] += 1;
	}
}

int query(int x)
{
	int res = 0;
	for(int i = x; i > 0; i-= lowbit(i))
	{
		res += c[i];
	}
	return res;
}

int main()
{
	cin >> n;
	
	for(int i = 1; i <= n; i ++)
	{
		cin >> a[i];
		b[i] = i;
	}
	
	sort(b+1, b+1+n, [](int x, int y){
	return a[x] == a[y] ? x > y : a[x] > a[y];
	});
	
	int res = 0;
	
	for(int i = 1; i <= n; i ++)
	{
		res += query(b[i]);
		add(b[i]);
	}
	
	cout << res << endl;
	
	return 0;
}

你可能感兴趣的:(算法模板,树状数组,算法,c++,数据结构)