玄关求助!!!
查看原帖
玄关求助!!!
547787
__Refine__楼主2025/1/2 21:39
#include<bits/stdc++.h>
#define lll long long

using namespace std;
const int MAXN=1e5+10;

struct dian
{
	lll t,pos,zhi,ans;
}d[MAXN];
struct tree
{
	lll kk,tre[MAXN];
	void add(int x,int y)
	{
		for(;x<=kk;x+=x&-x)tre[x]+=y;
	}
	lll query(int x)
	{
		lll all=0;
		for(;x;x-=x&-x)all+=tre[x];
		return all;
	}
}tt,t2;
lll n,m,all[MAXN],a[MAXN];
bool cmp1(dian x,dian y)
{
	return x.pos<y.pos;
}
bool cmp2(dian x,dian y)
{
	return x.zhi>y.zhi;
}
void CDQ(int l,int r)
{
	if(l==r)return ;
	int mid=(l+r)>>1;
	CDQ(l,mid),CDQ(mid+1,r);
	sort(d+l,d+mid+1,cmp2);
	sort(d+mid+1,d+r+1,cmp2);
	int ll=l,rr=mid+1;
	while(rr<=r)
	{
		while(d[ll].zhi>d[rr].zhi&&ll<=mid) tt.add(d[ll++].t,1);
		d[rr].ans+=tt.query(d[rr].t);
		rr++;
	}
	for(int i=l;i<ll;i++){
		tt.add(d[i].t,-1);
	}
	ll=mid,rr=r;
	while(ll>=l)
	{
		while(d[rr].zhi<d[ll].zhi&&rr>mid) tt.add(d[rr--].t,1);
		d[ll].ans+=tt.query(d[ll].t);
		ll--;
	}
	for(int i=rr+1;i<=r;i++)
	{
		tt.add(d[i].t,-1);
	}
}
int main()
{
	cin>>n>>m;
	tt.kk=n;
	t2.kk=n;
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		a[i]=x;
		d[x].zhi=x;
		d[x].pos=i;
		d[i].t=m+1;
	}
	for(int i=1;i<=m;i++)
	{
		int x;
		scanf("%d",&x);
		d[x].t=m-i+1;
	} 
	lll q=0;
	for(int i=n;i>=1;i--)
	{
		t2.add(a[i],1);
		q+=t2.query(a[i]-1);
	}
	sort(d+1,d+1+n,cmp1);
	CDQ(1,n);
	//sort(d+1,d+1+n,cmp1);
	//CDQ(1,n);
	for(int i=1;i<=n;i++)
	{
		all[d[i].t]+=d[i].ans;
	}
	for(int i=1;i<=m;i++)
	{
		printf("%lld\n",q);
		q-=all[m-i+1];
	}
	return 0;
}
2025/1/2 21:39
加载中...