fastle
垆边人似月 皓腕凝霜雪
/*
动态求逆序对,可以树套树来写, 将交换操作理解成插入和删除比较好理解, 里层是个区间求和的线段树就好了
或者叫 带修主席树?
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#define ll long long
#define M 23000
#define mmp make_pair
using namespace std;
int read() {
	int nm = 0, f = 1;
	char c = getchar();
	for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
	for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
	return nm * f;
}

int ls[M << 8], rs[M << 8], t[M << 8], rt[M], a[M], b[M], cnt, ans, n, q;
int lowbit(int x) {
	return x & (-x);
}

void modify(int &now, int l, int r, int pl, int v) {
	if(l > pl || r < pl) return;
	if(now == 0) now = ++cnt;
	t[now] += v;
	if(l == r) return;
	int mid = (l + r) >> 1;
	modify(ls[now], l, mid, pl, v), modify(rs[now], mid + 1, r, pl, v);
}

void Modify(int x, int pl, int v) {
	for(; x <= n; x += lowbit(x)) modify(rt[x], 1, n, pl, v);
}

int query(int now, int l, int r, int ln, int rn) {
	if(l > rn || r < ln) return 0;
	if(l >= ln && r <= rn) return t[now];
	int mid = (l + r) >> 1;
	return query(ls[now], l, mid, ln, rn) + query(rs[now], mid + 1, r, ln, rn);
}

int Query(int x, int L, int R) {
	if(L > R) return 0;
	int tmp = 0;
	for(; x; x -= lowbit(x)) tmp += query(rt[x], 1, n, L, R);
	return tmp;
}

int main() {
	n = read();
	for(int i = 1; i <= n; i++) a[i] = b[i] = read();
	sort(b + 1, b + n + 1);
	for(int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + n + 1, a[i]) - b;
	for(int i = 1; i <= n; i++) {
		ans += Query(i, a[i] + 1, n);
		Modify(i, a[i], 1);
	}
	cout << ans << "\n";
	q = read();
	while(q--) {
		int x = read(), y = read();
		if(x > y) swap(x, y);
		ans += Query(y - 1, a[x] + 1, n) - Query(x, a[x] + 1, n);
		ans -= Query(y - 1, 1, a[x] - 1) - Query(x, 1, a[x] - 1);
		ans -= Query(y - 1, a[y] + 1, n) - Query(x, a[y] + 1, n);
		ans += Query(y - 1, 1, a[y] - 1) - Query(x, 1, a[y] - 1);
		if(a[x] < a[y]) ans++;
		else if(a[x] > a[y]) ans--;
		Modify(x, a[x], -1), Modify(y, a[y], -1);
		swap(a[x], a[y]);
		Modify(x, a[x], 1), Modify(y, a[y], 1);
		cout << ans << "\n";
	}
	return 0;
}
posted on 2019-04-11 20:25  fastle  阅读(112)  评论(0编辑  收藏  举报