求解树状数组套主席树的空间问题
查看原帖
求解树状数组套主席树的空间问题
29354
CodyTheWolf楼主2020/9/12 01:51

我这里的MAXN要开到2e5,MAXLOG要开到50才能AC,如果少了就要WA或者RE,想问问为啥ORZ

(不是开nlogn的空间就可以了吗,MAXN为啥还要多一倍)

#include <iostream>
#include <cstdio>
#include <cstring>
#define mid ((x+y)>>1) 
using namespace std;
typedef long long LL;
const int MAXN=1e5+5,MAXLOG=21,MAXT=MAXN*MAXLOG;
int a[MAXN],pst[MAXN];
int u[MAXLOG],v[MAXLOG],ulen,vlen;
int n,m;
LL ans;

struct BinaryIndexTree
{
	int b[MAXN];
	inline void Modify(int x)	{for(;x<=n;x+=x&-x)	b[x]++;}
	inline int Query(int x,int ans=0)	{for(;x;x^=x&-x) ans+=b[x];return ans;}
}BIT;

struct PresidentTree
{
	int a[MAXT],l[MAXT],r[MAXT],root[MAXT],tot=0;
	
	inline void Modify(int x,int y,int &pos,int p,int val)
	{
		if(!pos)	pos=++tot;
		a[pos]+=val;
		if(x!=y)
		{
			if(p<=mid)	Modify(x,mid,l[pos],p,val);
			else	Modify(mid+1,y,r[pos],p,val);
		}
		return;
	}
	
	inline int Query(int x,int y,int ql,int qr)
	{
		if(y<ql||x>qr)	return 0;
		if(ql<=x&&y<=qr)
		{
			int sum=0;
			for(int i=1;i<=vlen;i++)	sum+=a[v[i]];
			for(int i=1;i<=ulen;i++)	sum-=a[u[i]];
			return sum;
		}
		int tempu[MAXLOG],tempv[MAXLOG];
		for(int i=1;i<=vlen;i++)	tempv[i]=v[i];
		for(int i=1;i<=ulen;i++)	tempu[i]=u[i];
		for(int i=1;i<=vlen;i++)	v[i]=l[v[i]];
		for(int i=1;i<=ulen;i++)	u[i]=l[u[i]];
		int temp=Query(x,mid,ql,qr);
		for(int i=1;i<=vlen;i++)	v[i]=r[tempv[i]];
		for(int i=1;i<=ulen;i++)	u[i]=r[tempu[i]];
		return temp+Query(mid+1,y,ql,qr);
	}
}PT;

inline void Modify(int x,int val)
{
	for(int i=x;i<=n;i+=i&-i)	PT.Modify(1,n,PT.root[i],a[x],val);
	return;	
}

inline int Query(int l,int r,int x,int y)
{
	ulen=vlen=0;
	for(;r;r-=r&-r)	v[++vlen]=PT.root[r];
	for(--l;l;l-=l&-l)	u[++ulen]=PT.root[l];
	return PT.Query(1,n,x,y);
}

signed main(void)
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		scanf("%d",a+i),pst[a[i]]=i;
	for(int i=1;i<=n;i++)
		ans+=(i-1)-BIT.Query(a[i]),BIT.Modify(a[i]);
	for(int i=1;i<=n;i++)
		Modify(i,1);
	for(int i=1,x;i<=m;i++)
	{
		printf("%lld\n",ans);
		scanf("%d",&x);
		ans-=Query(1,pst[x]-1,x+1,n);
		ans-=Query(pst[x]+1,n,1,x-1);
		Modify(pst[x],-1);
	}
	return 0;
}
2020/9/12 01:51
加载中...