95分而且和smarthehe ,sys,滑雪王子CloudKit挂都的不一样
查看原帖
95分而且和smarthehe ,sys,滑雪王子CloudKit挂都的不一样
483966
一粒夸克楼主2022/1/4 18:13

#18 RE 了

只 RE 了一个点,系统信息: Exit code: 11

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int ans;
namespace T2{
	int rt[800005],tree[80000005],le[80000005],ri[80000005],all;
	int dep[800005];
	int merge(int a,int b,int &res){
		if(!a||!b)return a+b;
		if(le[a]&&ri[b])res=max(res,tree[le[a]]+tree[ri[b]]);
		if(ri[a]&&le[b])res=max(res,tree[ri[a]]+tree[le[b]]);
		le[a]=merge(le[a],le[b],res);
		ri[a]=merge(ri[a],ri[b],res);tree[a]=max(tree[a],tree[b]);
		return a;
	}
	int ver[800005],ne[800005],head[800005],cnt,val[800005];
	inline void link(int x,int y,int v){
		ver[++cnt]=y;
		ne[cnt]=head[x];
		head[x]=cnt;val[cnt]=v;
	}
	void dfs(int x,int fi){
		int res=-1e18;
		for(int i=head[x];i;i=ne[i]){
			int u=ver[i];
			if(u==fi)continue;
			dep[u]=dep[x]+val[i];
			dfs(u,x);rt[x]=merge(rt[x],rt[u],res);
		}
		ans=max(ans,res-2*dep[x]);
	}
}
namespace T1{
	int ver[1600005],ne[1600005],head[1600005],cnt=1,val[1600005];
	inline void link(int x,int y,int v){
		ver[++cnt]=y;
		ne[cnt]=head[x];
		head[x]=cnt;val[cnt]=v;
	}
	int dep[800005],fa[800005];
	vector<int> son[800005];
	void init(int x,int fi){
		for(int i=head[x];i;i=ne[i]){
			int u=ver[i];
			if(u==fi)continue;
			dep[u]=dep[x]+val[i];fa[u]=val[i];
			init(u,x);son[x].push_back(u);
		}
	}
	inline void build(){
		init(1,1);m=n;
		for(int i=1;i<=n;i++)head[i]=0;cnt=1;
		for(int i=1;i<=m;i++){
			if(son[i].size()<3){
				for(auto it:son[i]){
					link(i,it,fa[it]);link(it,i,fa[it]);
				}
			}else {
				int le=++m,ri=++m;
				link(i,le,0);link(le,i,0);
				link(i,ri,0);link(ri,i,0);
				for(auto it:son[i])son[le].push_back(it),swap(le,ri);
			}
		}
	}
	int siz[800005],mxp[800005],rt;
	bool vis[1600005];
	void findrt(int x,int fi,int tot){
		siz[x]=1;
		for(int i=head[x];i;i=ne[i]){
			int u=ver[i];
			if(vis[i]||u==fi)continue;
			findrt(u,x,tot);siz[x]+=siz[u];
			mxp[i>>1]=max(siz[u],tot-siz[u]);
			if(mxp[i>>1]<mxp[rt])rt=(i>>1);
		}
	}
	int dis[800005],lst[800005];
	vector<int> vec;
	void dfs(int x,int fi){
		vec.push_back(x);siz[x]=1;
		for(int i=head[x];i;i=ne[i]){
			int u=ver[i];
			if(vis[i]||u==fi)continue;
			dis[u]=dis[x]+val[i];
			dfs(u,x);siz[x]+=siz[u];
		}
	}
	void solve(int x){
		mxp[rt=0]=n;findrt(x,x,siz[x]);
		if(!rt)return ;vis[rt<<1]=vis[rt<<1|1]=1;
		int L=ver[rt<<1],R=ver[rt<<1|1];
		vec.clear();dis[L]=val[rt<<1];dfs(L,R);
		for(auto it:vec){
			if(it>n)continue;
			T2::le[lst[it]]=++T2::all;lst[it]=T2::all;
			T2::tree[lst[it]]=dis[it]+dep[it];
		}
		vec.clear();dis[R]=0;dfs(R,L);
		for(auto it:vec){
			if(it>n)continue;
			T2::ri[lst[it]]=++T2::all;lst[it]=T2::all;
			T2::tree[lst[it]]=dis[it]+dep[it];
		}
		solve(L);solve(R);
	}
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<n;i++){
		int x,y,z;scanf("%lld%lld%lld",&x,&y,&z);
		T1::link(x,y,z);T1::link(y,x,z);
	}
	for(int i=1;i<n;i++){
		int x,y,z;scanf("%lld%lld%lld",&x,&y,&z);
		T2::link(x,y,z);T2::link(y,x,z);
	}
	for(int i=1;i<=n;i++)T2::rt[i]=T1::lst[i]=++T2::all;
	T1::siz[1]=n;T2::tree[0]=-1e18;
	T1::build();T1::solve(1);T2::dfs(1,1);ans/=2;
	for(int i=1;i<=n;i++)ans=max(ans,T1::dep[i]-T2::dep[i]);
	printf("%lld",ans);
	
	return 0;
}

2022/1/4 18:13
加载中...