万恶的多组数据
查看原帖
万恶的多组数据
61430
Lice楼主2020/5/13 20:43

rt,洛谷上过了,uva的多组数据直接WA了

到底还要哪里没有清空啊啊啊QAQ

#include <cstdio>

using namespace std;
const int N = 2e5 + 5;
const int S = N << 9;
#define lbt(x) (x & (-x))
#define mid ((l + r) >> 1)

int n, m;
int val[N], loc[N];
long long cnt = 0ll;

int root[N];
int lc[S], rc[S];
int size[S];
int total = 0;

void modify(int& x, int l, int r, int p, int v) {
	if (!x) x = ++total;
	size[x] += v;
	if (l == r) return;
	if (p <= mid) modify(lc[x], l, mid, p, v);
	else modify(rc[x], mid + 1, r, p, v);
}

int node[2][N];
inline int get(int l, int r, int x, bool tag) {
	int cnt[2] = {0, 0}, ret = 0;
	for (register int p = r; p; p -= lbt(p)) node[0][++cnt[0]] = root[p];
	for (register int p = l - 1; p; p -= lbt(p)) node[1][++cnt[1]] = root[p];
	
	for (l = 1, r = n; l != r; )
		if (x > mid) {
			if (tag) {
				for (register int i = 1; i <= cnt[0]; i++) ret += size[lc[node[0][i]]];
				for (register int i = 1; i <= cnt[1]; i++) ret -= size[lc[node[1][i]]];
			}
			for (register int i = 1; i <= cnt[0]; i++) node[0][i] = rc[node[0][i]];
			for (register int i = 1; i <= cnt[1]; i++) node[1][i] = rc[node[1][i]];
			l = mid + 1;
		} else {
			if (!tag) {
				for (register int i = 1; i <= cnt[0]; i++) ret += size[rc[node[0][i]]];
				for (register int i = 1; i <= cnt[1]; i++) ret -= size[rc[node[1][i]]];
			}
			for (register int i = 1; i <= cnt[0]; i++) node[0][i] = lc[node[0][i]];
			for (register int i = 1; i <= cnt[1]; i++) node[1][i] = lc[node[1][i]];
			r = mid;
		}
	return ret;
}

void clear(int x) {
	if (!x) return;
	clear(lc[x]), clear(rc[x]);
	lc[x] = rc[x] = size[x] = 0;
}

signed main() {
	while (scanf("%d%d", &n, &m) != EOF) {
		for (register int i = 1; i <= n; i++)
			clear(root[i]), root[i] = 0, loc[i] = val[i] = 0;
		total = 0;
		
		for (register int i = 1; i <= n; i++) {
			scanf("%d", val + i), loc[val[i]] = i;
			cnt += get(1, i - 1, val[i], 0);
			for (register int p = i; p <= n; p += lbt(p))
				modify(root[p], 1, n, val[i], 1);
		}
		
		for (register int x; m; --m) {
			scanf("%d", &x);
			printf("%lld\n", cnt);
			cnt -= get(1, loc[x] - 1, x, 0);
			cnt -= get(loc[x] + 1, n, x, 1);
			for (register int p = loc[x]; p <= n; p += lbt(p))
				modify(root[p], 1, n, x, -1);
		}	
	}
	return 0;
}
2020/5/13 20:43
加载中...