可爱小萌新求条cdq分治
查看原帖
可爱小萌新求条cdq分治
774854
qzmoot楼主2024/7/10 19:27
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,M=3e7+5;
int n,m,idx,ans;
int a[N],pos[N],rt[N],t[M],ls[M],rs[M];
inline int lowbit(int x)
{
	return x&-x;
}
void init()
{
	memset(rt,0,sizeof rt);
	memset(t,0,sizeof t);
	memset(ls,0,sizeof ls);
	memset(rs,0,sizeof rs);
}
void upd(int& k,int l,int r,int pos,int val)
{
	if (!k)
		k=++idx;
	t[k]+=val;
	if (l==r)
		return;
	int mid=l+r>>1;
	if (pos<=mid)
		upd(ls[k],l,mid,pos,val);
	else
		upd(rs[k],mid+1,r,pos,val);
}
int query(int l,int r,int x,int op)
{
	int st1[N],st2[N],top1=0,top2=0,res=0;
	for (int i=l-1; i; i-=lowbit(i))
		st1[++top1]=rt[i];
	for (int i=r; i; i-=lowbit(i))
		st2[++top2]=rt[i];
	l=1,r=n;
	while (l!=r)
	{
		int mid=l+r>>1;
		if (x>mid)
		{
			if (op)
			{
				for (int i=1; i<=top1; i++)
					res-=t[ls[st1[i]]];
				for (int i=1; i<=top2; i++)
					res+=t[ls[st2[i]]];
			}
			for (int i=1; i<=top1; i++)
				st1[i]=rs[st1[i]];
			for (int i=1; i<=top2; i++)
				st2[i]=rs[st2[i]];
			l=mid+1;
		}
		else
		{
			if (!op)
			{
				for (int i=1; i<=top1; i++)
					res-=t[rs[st1[i]]];
				for (int i=1; i<=top2; i++)
					res+=t[rs[st2[i]]];
			}
			for (int i=1; i<=top1; i++)
				st1[i]=ls[st1[i]];
			for (int i=1; i<=top2; i++)
				st2[i]=ls[st2[i]];
			r=mid;
		}
	}
	return res;
}
signed main()
{
	while(scanf("%lld%lld",&n,&m)!=EOF)
	{
		init();
		for (int i=1; i<=n; i++)
		{
			scanf("%lld",a+i);
			pos[a[i]]=i;
			ans+=query(1,i-1,a[i],0);
			for (int j=i; j<=n; j+=lowbit(j))
				upd(rt[j],1,n,a[i],1);
		}
		printf("%lld\n",ans);
		for (int i=1; i<m; i++)
		{
			int num;
			scanf("%lld",&num);
			ans-=query(1,pos[num]-1,num,0)+query(pos[num]+1,n,num,1);
			printf("%lld\n",ans);
			for (int j=pos[num]; j<=n; j+=lowbit(j))
				upd(rt[j],1,n,num,-1);
		}
	}
	return 0;
}
2024/7/10 19:27
加载中...