求助静态toptree建树维护直径,马蜂清晰
查看原帖
求助静态toptree建树维护直径,马蜂清晰
421265
eastcloud楼主2024/4/29 17:49

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);
	}
}
2024/4/29 17:49
加载中...