求助!
查看原帖
求助!
141599
sinsop90楼主2022/4/8 21:11
#include <bits/stdc++.h>
#define maxn 200005
using namespace std;
int t[maxn], n, m, c[maxn];
struct node {
	int a, b, ans;
}a1[maxn << 1];
bool cmp(node a, node b) {
	if(a.a != b.a) return a.a < b.a;
	return a.b < b.b;
}
bool cmp2(node a, node b) {
	return a.b < b.b;
}
int lowbit(int x) {
	return x & (-x);
}
int add(int x, int ad) {
	while(x <= n) {
		c[x] += ad;
		x += lowbit(x);
	}
}
int query(int x) {
	int res = 0;
	while(x) {
		res += c[x];
		x -= lowbit(x);
	}
	return res;
}
void cdq(int l, int r) {
	if(l == r) return;
	int mid = (l + r) >> 1;
	cdq(l, mid);
	cdq(mid + 1, r);
	sort(a1 + l, a1 + mid + 1, cmp);
	sort(a1 + mid + 1, a1 + r + 1, cmp);
	int j = mid + 1, i = l;
	while(i <= mid) {
		while(a1[i].a > a1[j].a && j <= r) {
			add(a1[j].b, 1);
			j ++;
		}
		a1[i].ans += query(m + 1) - query(a1[i].b);
		i ++;
	}
	while(i <= mid) {
		while(a1[i].a > a1[j].a && j <= r) {
			add(a1[j].b, -1);
			j ++;
		}
		i ++;
	}
//	for(int p = mid + 1;p < j;p++) add(a1[p].b, -1);
	j = r, i = mid;
	while(j > mid) {
		while(a1[j].a < a1[i].a && i >= l) {
			add(a1[i].b, 1);
			i --;
		}
		a1[j].ans += query(m + 1) - query(a1[j].b);
		j --;
	}
	while(j < mid) {
		while(a1[j].a < a1[i].a && i >= l) {
			add(a1[i].b, -1);
			i --;
		}
		j --;
	}
//	for(int p = mid;p > i;p --) add(a1[p].b, -1);
//	sort(a1 + l, a1 + r + 1, cmp);
	return;
}
int main() {
	int res = 0;
	scanf("%d%d", &n, &m);
	for(int i = 1;i <= n;i++) {
		scanf("%d", &a1[i].a);
		t[a1[i].a] = i;
	}
	for(int i = 1;i <= m;i++) {
		int x;
		scanf("%d", &x);
		a1[t[x]].b = i;
	}
	for(int i = 1;i <= n;i++) {
		if(!a1[i].b) a1[i].b = m + 1;
	}
	for(int i = 1;i <= n;i++) {
		res += query(n + 1) - query(a1[i].a);
		add(a1[i].a, 1);
	}
	for(int i = 1;i <= n;i++) add(a1[i].a, -1);
	cdq(1, n);
	sort(a1 + 1, a1 + 1 + n, cmp2);
	for(int i = 1;i <= m;i++) {
		printf("%d\n", res);
		res -= a1[i].ans;
	} 
}
2022/4/8 21:11
加载中...