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;}