题目链接:https://vjudge.net/problem/UVA-11990
过几天我再来写题解
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define ll long long
using namespace std;
const int MAX = 2e5 + 10;
struct node{
int t, v, index;
bool flag;
};
node a[MAX], b[MAX];
int pos[MAX];
int ans[MAX];
int bit[MAX];
int n, m;
int sum(int i) {
int s = 0;
while (i > 0) {
s += bit[i];
i -= i & (-i);
}
return s;
}
void add(int i, int x) {
while(i <= n) {
bit[i] += x;
i += i & (-i);
}
}
bool cmpt(node a, node b){
return a.t < b.t;
}
bool cmpx(node a, node b){
return a.index < b.index;
}
void cdq(int L, int R) {
if(L >= R) return;
int mid = (L + R) / 2;
int len = 0;
for(int i = L; i <= mid; i++) {
b[++len] = a[i];
b[len].flag = 0;
}
for(int i = mid + 1; i <= R; i++) {
b[++len] = a[i];
b[len].flag = 1;
}
sort(b + 1, b + len + 1, cmpx);
for(int i = 1; i <= len; i++) {
if(b[i].flag == 0)
add(b[i].v, 1);
else
ans[b[i].t] += sum(n) - sum(b[i].v);
}
for(int i = 1; i <= len; i++) {
if(b[i].flag == 0)
add(b[i].v, -1);
}
for(int i = len; i >= 1; i--) {
if(b[i].flag == 0)
add(b[i].v, 1);
else ans[b[i].t] += sum(b[i].v);
}
for(int i = 1; i <= len;i++) {
if(b[i].flag == 0)
add(b[i].v, -1);
}
cdq(L, mid);
cdq(mid + 1, R);
}
int main() {
while (scanf("%d%d", &n, &m) != EOF) {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(ans, 0, sizeof(ans));
memset(pos, 0, sizeof(pos));
memset(bit, 0, sizeof(bit));
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i].v);
pos[a[i].v] = i;
a[i].index = i;
}
int T = n;
for(int i = 1; i <= m; i++) {
int x;
scanf("%d", &x);
a[pos[x]].t = T--;
}
for(int i = 1; i <= n; i++) {
if(!a[i].t) a[i].t = T--;
}
sort(a + 1, a + n + 1, cmpt);
cdq(1, n);
ll res = 0;//int res 是错的
for(int i = 1; i <= n; i++) res += ans[i];
for(int i = n; i >= n - m + 1; i--) {
printf("%lld\n", res);
res -= ans[i];
}
}
}
//5 4 1 5 3 4 2 5 1 4 2