玄关求条超级简单生成树
  • 板块CF888G Xor-MST
  • 楼主qzmoot
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/9/9 22:32
  • 上次更新2024/9/10 17:24:44
查看原帖
玄关求条超级简单生成树
774854
qzmoot楼主2024/9/9 22:32

惨遭MLE

#include <bits/stdc++.h>
#define P pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
using namespace std;
const int N=2e5+5,K=32;
int n;
int a[N];
int f[N];
int idx[N],en[N][K<<3];
int fl=1;
int ans;
struct node{
	int ch[2],siz,fa;
}tr[N][K<<3];
vector<int>son[N];
void add(int id,int num,int nid)
{
	int p=0;
	for(int i=4;i>=0;i--)
	{
		bool x=num&(1<<i);
		if(!tr[id][p].ch[x])
			tr[id][p].ch[x]=++idx[id],tr[id][idx[id]].fa=p;
		p=tr[id][p].ch[x];
	}
	en[id][p]=nid;
	tr[id][p].siz=1;
	p=tr[id][p].fa;
	while(p!=-1)
	{
		tr[id][p].siz=1+tr[id][tr[id][p].ch[0]].siz+tr[id][tr[id][p].ch[1]].siz;
		p=tr[id][p].fa;
	}
	tr[id][0].siz=0;
}
int find(int x)
{
	return f[x]==x?x:f[x]=find(f[x]);
}
int to[N],len[N];
P query(int id,int num)
{
	int mrt=0,nrt=0;
	int res=0;
	for(int i=4;i>=0;i--)
	{
		bool x=num&(1<<i);
		if(tr[0][tr[0][mrt].ch[x]].siz-tr[id][tr[id][nrt].ch[x]].siz>0)
			mrt=tr[0][mrt].ch[x],nrt=tr[id][nrt].ch[x];
		else
		{
			mrt=tr[0][mrt].ch[x^1];
			if(!tr[id][nrt].ch[x^1])
				tr[id][nrt].ch[x^1]=++idx[id],tr[id][idx[id]].fa=nrt;
			nrt=tr[id][nrt].ch[x^1];
			res+=(1<<i);
		}
	}
	return mp(en[0][mrt],res);
}
int main()
{
	scanf("%d",&n);
	for(int i=0;i<=n;i++)
		tr[i][0].fa=-1,tr[i][0].siz=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		add(0,a[i],i);
	}
	for(int i=1;i<=n;i++)
		add(i,a[i],0),f[i]=i,son[i].pb(i);
	while(fl)
	{
		fl=0;
		memset(to,-1,sizeof to);
		memset(len,0x3f,sizeof len);
		for(int i=1;i<=n;i++)
		{
			P ret=query(find(i),a[i]);
			if(len[find(i)]>ret.se)
				to[find(i)]=ret.fi,len[find(i)]=ret.se;
		}
		for(int i=1;i<=n;i++)
		{
			int fx=find(i);
			if(to[fx]!=0 && to[fx]!=-1 && fx!=find(to[fx]))
			{
				ans+=len[fx];
				for(auto val:son[find(to[fx])])
				{
					son[fx].pb(val);
					add(fx,val,0);
				}
				f[find(to[fx])]=fx;
				tr[fx][0].siz=0;
				tr[find(to[fx])][0].siz=0;
				fl=1;
			}
		}
	}
	printf("%d",ans);
	return 0;
}
2024/9/9 22:32
加载中...