WA45pts
查看原帖
WA45pts
678673
Sio_楼主2023/10/1 21:22

remake写错了,导致explore的第一个参数x为0,调了一整天了

#include<bits/stdc++.h>
using namespace std;
const int maxn=300005;
bool flag[maxn],vis[maxn];
int a[maxn],allsiz,siz[maxn],ctr,root,N;
vector<int> nbr[maxn],f[maxn],g[maxn];
//int explore(int x,int y){};
map<int,int> tree[maxn];
int explore(int x,int y);
mt19937 rd(1);
void dfs1(int cur,int fa)
{
//	cout<<allsiz<<" "<<cur<<" "<<fa<<"\n";
	siz[cur]=1;
	int maxi=0;
	for(int i=0;i<nbr[cur].size();i++)
	{
		int nxt=nbr[cur][i].first;
		if(fa==nxt||vis[nxt]==0) continue;
		dfs1(nxt,cur);
		if(ctr!=-1) return;
		siz[cur]+=siz[nxt],maxi=max(maxi,siz[nxt]);
	}
	maxi=max(maxi,allsiz-siz[cur]);
	if(maxi<=allsiz/2) ctr=cur,siz[fa]=allsiz-siz[cur];
}
void dfs2(int anc,int cur,int fa)
{
	f[cur].emplace_back(anc);g[anc].emplace_back(cur);
	for(int i=0;i<nbr[cur].size();i++)
	{
		int nxt=nbr[cur][i];
		if(fa!=nxt&&vis[nxt]!=0) dfs2(anc,nxt,cur);
	}
}
void run(int cur)
{
	vis[cur]=0;
	dfs2(cur,cur,0);
	for(int i=0;i<nbr[cur].size();i++)
	{
		int nxt=nbr[cur][i];
		if(vis[nxt]==0) continue;
		allsiz=siz[nxt];
		ctr=-1;dfs1(nxt,0);run(ctr);
		for(int j=0;j<g[ctr].size();j++) tree[cur][g[ctr][j]]=ctr;
	}
}
void remake(int x)
{
	for(int i=0;i<f[x].size()-1;i++)
	{
		int nxt=f[x][i];
		if(g[f[x][i+1]].size()<g[nxt].size()*0.7) continue;
		allsiz=g[nxt].size();
		for(int k=0;k<g[nxt].size();k++)
		{ 
			int son=g[nxt][k];
			vis[son]=1;
			tree[son].clear();
			if(nxt!=son) g[son]={};
			while(f[son].back()!=nxt) f[son].pop_back();
			f[son].pop_back();
		}
		g[nxt]={};
		ctr=-1;dfs1(nxt,0);
		if(i==0) root=ctr;
		run(ctr);
		break; 
	}
}
inline void insert(int x,int y)
{
	nbr[y].emplace_back(x);
	nbr[x].emplace_back(y);
	f[x]=f[y];f[x].emplace_back(x);g[x].emplace_back(x);
	for(int i=0;i<f[x].size()-1;i++) g[f[x][i]].emplace_back(x),tree[f[x][i]][x]=f[x][i+1];
}
void play(int n,int T,int dataType)
{
	N=n;
	for(int i=1;i<=n;i++) a[i]=i;
	shuffle(a+1,a+n+1,rd);
	flag[1]=1;
	f[1].emplace_back(1);g[1].emplace_back(1);
	if(dataType==3)
	{
		int b[2]={1,1};
		for(int i=1;i<=n;i++)
		{
			if(flag[a[i]]==1) continue;
			int opt=rd()%2,nxt=explore(b[opt],a[i]);
			if(flag[nxt]==1) opt^=1;
			while(flag[a[i]]==0){if(flag[nxt]==1) nxt=explore(b[opt],a[i]);flag[nxt]=1,b[opt]=nxt;}
		}
	}
	else
	{
		root=1;
		for(int i=1;i<=n;i++)
		{
			if(flag[a[i]]==1) continue;
			int now=root,fa=0;
			while(1)
			{
				int nxt=explore(now,a[i]);
				if(flag[nxt]==0){fa=now,now=nxt;break;}
				else now=tree[now][nxt];
			}
			while(flag[a[i]]==0)
			{
				flag[now]=1;
				insert(now,fa);
				remake(now);
				if(now!=a[i]) fa=now,now=explore(now,a[i]);
			}
		}
	}
}
//int main(){return 0;}
2023/10/1 21:22
加载中...