动态开点线段树逆序对求调
  • 板块学术版
  • 楼主Placy
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/1/30 14:17
  • 上次更新2023/10/24 02:34:06
查看原帖
动态开点线段树逆序对求调
826246
Placy楼主2023/1/30 14:17

rt,谢谢大佬们。

#include <iostream>
#include <cstring>
#define int long long
using namespace std;
int T, n, x;
int ans, tot = 1;
int a[1600000], ls[1600000], rs[1600000];
void add (int l, int r, int k) {
	++ a[k];
	if (l == r) return;
	int mid = l + r >> 1;
	if (x <= mid) {
		if (! ls[k]) ls[k] = ++ tot;
		add (l, mid, ls[k]);
	}
	else {
		if (! rs[k]) rs[k] = ++ tot;
		add (mid + 1, r, rs[k]);
	}
}
int query (int y, int l, int r, int k) {
	if (y >= r) return a[k];
	int mid = l + r >> 1, res = query (y, l, mid, ls[k]);
	if (y > mid) {
		if (!rs[k]) rs[k] = ++ tot;
		res += query (y, mid + 1, r, rs[k]);
	}
	return res;
}
signed main () {
	scanf ("%lld", &T);
	while (T --) {
		tot = 1;
		ans = 0;
		memset (a, 0, sizeof a);
		memset (ls, 0, sizeof ls);
		memset (rs, 0, sizeof rs);
		scanf ("%lld", &n);
		for (int i = 1; i <= n; i ++) {
			scanf ("%lld", &x);
			ans += a[1] - query (x, -1000000000, 1000000000, 1);
			add (-100000000, 1000000000, 1);
		}
		printf ("%lld\n", ans);
	}
	return 0;
}
2023/1/30 14:17
加载中...