萌新刚学 oi 求调 cdq
查看原帖
萌新刚学 oi 求调 cdq
371825
SalN楼主2023/4/26 13:57
#include<bits/stdc++.h>
#define int long long
#define MN 200010

using namespace std;

int n, m, top, tr[MN], rp[MN], ans[MN], qwq;
struct dat { int w, a, t, cnt; } p[MN];

void add(int x,int v) {
	for( ; x<=n; x+=x&-x) tr[x]+=v;
}

int ask(int x) {
	int res=0;
	for( ; x; x-=x&-x) res+=tr[x];
	return res;
}

bool byt(dat ix,dat iy) {
	return ix.t>iy.t;
}

bool bya(dat ix,dat iy) {
	return ix.a<iy.a;
}

void solve(int l,int r) {
	if(l>=r) return;
	int mid=(l+r)>>1;
	solve(l,mid);
	solve(mid+1,r);
	sort(p+l,p+mid+1,bya);
	sort(p+mid+1,p+r+1,bya);
	int j=l, i=mid+1;
	for( ; i<=r; ++i) {
		while(j<=mid&&p[j].a<p[i].a) 
			add(p[j++].w,1);
		p[i].cnt+=ask(n)-ask(p[i].w);
	}
	while(l<=--j) add(p[j].w,-1);
	j=mid, i=mid+1;
	for( ; i<=r; ++i) {
		while(j>=l&&p[j].a>p[i].a)
			add(p[j--].w,1);
		p[i].cnt+=ask(p[i].w);
	}
	while(++j<=mid) add(p[j].w,-1);
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m;
	for(int i=1; i<=n; ++i) {
		cin >> p[i].a;
		rp[p[i].a]=i;
		p[i].w=i, p[i].t=n;
		qwq+=ask(n)-ask(p[i].a);
		add(p[i].a,1);
	}
	for(int i=1; i<=n; ++i)
		add(p[i].a,-1);
	for(int i=1; i<=m; ++i) {
		int x;
		cin >> x;
		x=rp[x];
		p[x].t=i; 
	}
	sort(p+1,p+1+n,byt);
	solve(1,n);
	for(int i=1; i<=n; ++i)
		ans[p[i].t]=p[i].cnt;
	for(int i=1; i<=m; ++i) {
		cout << qwq << endl;
		qwq-=ans[i];
	}
	return 0;
}
2023/4/26 13:57
加载中...