求助CDQ分治,谢谢,好人一生平安!
查看原帖
求助CDQ分治,谢谢,好人一生平安!
206814
封禁用户楼主2022/10/4 09:13
#include <bits/stdc++.h>
using namespace std;
struct Number{
    int erase, value, ans;
}arr[100005];
auto cmp1 = [](Number a, Number b){
    return a.value < b.value;
};
auto cmp2 = [](Number a, Number b){
    return a.erase < b.erase;
};
int tree[100005], pos[100005];
int n, m;
int lowbit(int x) {
	return x & (-x);
}
void add(int x, int y) {
	for(; x <= n; x += lowbit(x)) {
		tree[x] += y;
	}
}
int ask(int x) {
	int ret = 0;
	for(; x > 0; x -= lowbit(x)) {
		ret += tree[x];
	}
	return ret;
}
void CDQ(int l, int r){
    if(l == r) return;
    int mid = (l + r) / 2;
    CDQ(l, mid);
    CDQ(mid + 1, r);
    int j = l;
    for(int i = mid + 1; i <= r; i++){
        while(arr[i].value >= arr[j].value && j <= mid) {
			add(arr[i].erase, 1);
			j++;
		}
		arr[i].ans += ask(arr[i].erase);
    }
    for(int i = l; i < j; i++){
        add(arr[i].erase, -1);
    }
    int i = mid + 1;
    for(int j = r; j > mid; j--){
        while(arr[j].value < arr[i].value && i <= r) {
			add(arr[i].erase, 1);
			i--;
		}
		arr[j].ans += ask(arr[j].erase);
    }
    for(int j = i; i < r; i++){
        add(arr[i].erase, -1);
    }
    sort(arr + l + 1, arr + r + 1, cmp1);
}
int main(){
    int res = 0;
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; i++){
        scanf("%d", &arr[i].value), arr[i].erase = m + 1;
        pos[arr[i].value] = i;
    }
    for(int i = 1, t; i <= m; i++){
        scanf("%d", &t);
        arr[pos[t]].erase = i;
    }
    for(int i = n; i >= 1; i--){
        res += ask(arr[i].value);
        add(arr[i].value, 1);
    }
    for(int i = 1; i <= n; i++){
        add(arr[i].value, -1);
    }
    CDQ(1, n);
    sort(arr + 1, arr + n + 1, cmp1);
    for(int i = 1; i <= m; i++){
        printf("%d\n", res);
        res -= arr[i].ans;
    }
    return 0;
}
2022/10/4 09:13
加载中...