rt,我这题一直wa在65pts,代进题解的转移代码之后仍然不变,因此我觉得有可能是建树和维护直径部分有问题,但是我调了一下午也没找出来,求助这份代码哪里有问题,完整代码在 https://loj.ac/s/2056368
#include"count.h"
#include<bits/stdc++.h>
#define N 400005
#define iter vector<int>::iterator
using namespace std;
vector<int> e[N];
namespace toptree{
info v[N<<1];
vector<info> f[N<<1][2],g[N<<1][2];
int cnt,ls[N],rs[N],siz[N],son[N],ty[N],ft[N],rt;
int dep[N],mi[N][21],dfn[N],ndfn;
struct Node{
int u,v,siz,lth,len,pre,suf;
Node(int u=0,int v=0,int siz=0,int lth=0,int len=0,int pre=0,int suf=0)
:u(u),v(v),siz(siz),lth(lth),len(len),pre(pre),suf(suf){}
Node operator +(Node x){
if(x.len==0)return Node(u,v,siz,lth,len,pre,suf);
else if(len==0)return x;
Node ans;ans.u=u;ans.v=v;ans.siz=siz+x.siz;
ans.len=len;ans.pre=max(pre,x.pre);ans.suf=max(suf,len+x.suf);
ans.lth=max(x.lth,max(lth,pre+x.pre));
return ans;
}
Node operator *(Node x){
if(x.len==0)return Node(u,v,siz,lth,len,pre,suf);
else if(len==0)return x;
Node ans;ans.u=u;ans.v=x.v;ans.siz=x.siz+siz;
ans.len=x.len+len;ans.pre=max(pre,len+x.pre);ans.suf=max(x.suf,x.len+suf);
ans.lth=max(x.lth,max(lth,suf+x.pre));
return ans;
}
}o[N];
int build(iter l,iter r,int t){
if((l+1)==r)return *l;
int sum=0,tot=0;iter mid=l+1;
for(iter i=l;i!=r;i++)sum+=o[*i].siz;
for(iter i=l;i!=r;i++){
tot+=o[*i].siz;
if(tot*2<=sum)mid=i+1;
}
++cnt;int p=cnt;
ls[p]=build(l,mid,t);rs[p]=build(mid,r,t);ft[ls[p]]=p;ft[rs[p]]=p;
o[p]=(t?o[ls[p]]*o[rs[p]]:o[ls[p]]+o[rs[p]]);
//cerr<<p<<' '<<ls[p]<<' '<<rs[p]<<' '<<o[p].lth<<' '<<o[p].pre<<' '<<t<<endl;
ty[p]=t;buildf(p);rt=p;
return p;
}
void dfs(int x,int fa){
dep[x]=dep[fa]+1;dfn[x]=++ndfn;mi[dfn[x]][0]=fa;
siz[x]=1;o[x]=Node(fa,x,0,0,0,0,0);
if(x!=1)o[x]=Node(fa,x,1,1,1,1,1);
f[x][0].push_back(emptyinfo);if(x!=1)f[x][0].push_back(v[x]);
f[x][1].push_back(emptyinfo);if(x!=1)f[x][1].push_back(v[x]);
for(auto v:e[x]){
dfs(v,x);siz[x]+=siz[v];
if(siz[v]>siz[son[x]])son[x]=v;
}
}
int dfs2(int x,int fa){
vector<int> L,H;
int tmpfa=fa;if(x!=1)H.push_back(x);
int flag=0;
//cerr<<x<<' '<<fa<<' '<<son[x]<<endl;
for(int u=x;son[u];u=son[u]){
L.push_back(son[u]);
for(auto v:e[u])if(v!=son[u])L.push_back(dfs2(v,u));
H.push_back(build(L.begin(),L.end(),0));L.clear();
//cerr<<x<<endl;
}
//cerr<<H.size()<<' '<<x<<endl;
return build(H.begin(),H.end(),1);
}
}