求助CDQ分治,谢谢,好人一生平安!

P3157 [CQOI2011] 动态逆序对

```cpp #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[j].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; j <= r; j++){ add(arr[j].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; } ```
by LiuTianyou @ 2022-10-04 09:30:35


@[LordLaffey](/user/335136)
by laplace_oo @ 2022-10-05 07:31:35


|