满江红0pts求调
查看原帖
满江红0pts求调
754467
f_hxr_楼主2023/9/13 15:23

rt。。。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL N,M,Ans[50005];
struct node{
	LL inx,id=0,dat,ans;
	void prt(){cout<<dat<<' '<<id<<endl;}
}a[50005];
struct BitTree{
	LL C[50005];
	BitTree(){memset(C,0,sizeof(C));}
	LL lowbit(LL X){return X&-X;}
	void add(LL X,LL K){for(;X<=N;X+=lowbit(X))C[X]+=K;}
	LL sum(LL X)
	{LL ret=0;for(;X;X-=lowbit(X))ret+=C[X];return ret;}
}BIT;
int cmp1(node A,node B){return A.inx>B.inx;}
int cmp2(node A,node B){return A.id<B.id;}
void CDQ(LL LHQ,LL RMQ){
	//cout<<"now CDQ to L: "<<LHQ<<" R: "<<RMQ<<endl;
	if(LHQ>=RMQ)return;
	LL mid=(LHQ+RMQ)>>1;
	CDQ(LHQ,mid);CDQ(mid+1,RMQ);
	sort(a+LHQ,a+mid+1,cmp2);
	sort(a+mid+1,a+RMQ+1,cmp2);
	LL p=LHQ;
	for(int i=mid+1;i<=RMQ;i++){
		while(a[p].id<a[i].id&&p<=mid)
			BIT.add(a[p].dat,1),p++;
		Ans[a[i].id]+=BIT.sum(a[i].dat);
	}
	for(int i=1;i<p;i++)BIT.add(a[p].dat,-1);
	p=mid;
	for(int i=RMQ;i>=mid-1;i--){
		while(a[p].id<a[i].id&&p>=LHQ)
			BIT.add(N-a[p].dat+1,1),p--;
		Ans[a[i].id]+=BIT.sum(N-a[i].dat+1);
	}
	for(int i=mid;i>p;i--)BIT.add(N-a[p].dat+1,-1);
}
int main(){
	LL A[50005],pos[50005];
	cin>>N>>M;
	for(int i=1;i<=N;i++)
	cin>>A[i],pos[A[i]]=i,a[i].inx=i,a[i].dat=A[i];
	for(int i=N;i>=N-M+1;i--)
	{int t;cin>>t;a[pos[t]].id=i;}
	for(int i=1,cnt=0;i<=N;i++)
	if(a[i].id==0)a[i].id=++cnt;
	sort(a+1,a+N+1,cmp1);
	CDQ(1,N);
	for(int i=1;i<=N;i++)
		Ans[i]+=Ans[i-1];
	for(int i=N;i>=N-M+1;i--)
		cout<<Ans[i]<<endl;
	return 0;
}
2023/9/13 15:23
加载中...