WA求助
查看原帖
WA求助
69296
Spartan117楼主2021/7/6 12:27
#include<bits/stdc++.h>
#define rep(I,a,b) for(ll I=(a);I<=(b);I++)
#define ll long long
using namespace std;
const ll N=2e5+5,INF=1e18;
ll n;
struct qxx{
	ll to,nxt,w;
}es[N<<2];
ll hd[N],tot;
inline void adde(ll u,ll v,ll w){
	es[++tot]=(qxx){v,hd[u],w};
	hd[u]=tot;
}
ll f[N][3];
vector<ll> g[N][3];
ll tmp[N];
ll mx[N][2];
ll vst[N];
ll kk[N][3];
ll ans=0;
void dfs(ll u,ll fa){
	//f[u][0]=0;
	vst[u]=1;
	ll mxv=0,mxv_t=0;
	for(ll i=hd[u];i;i=es[i].nxt){
		ll v=es[i].to,w=es[i].w;
		if(v==fa) continue;
		dfs(v,u); 	
	}
	for(ll i=hd[u];i;i=es[i].nxt){
		ll v=es[i].to,w=es[i].w;
		if(v==fa) continue;
		f[u][0]+=max(f[v][0],f[v][2]+w);
		tmp[v]=f[v][0]+w-max(f[v][0],f[v][2]+w);
		if(tmp[v]>tmp[mxv_t]) mxv_t=v;
		if(tmp[mxv_t]>tmp[mxv]) swap(mxv_t,mxv);
	}
	f[u][2]=f[u][0]+tmp[mxv];
	mx[u][0]=mxv;
	mx[u][1]=mxv_t;
}
void dfs2(ll u,ll fa,ll bkl,ll bkl2,ll w){
	//cout<<u<<' '<<fa<<' '<<bkl<<' '<<bkl2<<' '<<w<<endl;
	ll mxv=mx[u][0],mxv_t=mx[u][1];
	if(fa!=0){
		tmp[n+1]=bkl+w-max(bkl,bkl2+w);
		if(tmp[fa]>tmp[mxv_t]) mxv_t=n+1;
		if(tmp[mxv_t]>tmp[mxv]) swap(mxv_t,mxv);
	}
	kk[u][0]=f[u][0]+max(bkl,bkl2+w);
	ans=max(ans,kk[u][0]);
	for(ll i=hd[u];i;i=es[i].nxt){
		ll v=es[i].to,w=es[i].w;
		if(v==fa) continue;
		ll bk=0,bk2=0;
		bk=kk[u][0]-max(f[v][0],f[v][2]+w);
		if(v==mxv) bk2=bk+tmp[mxv_t];
		else bk2=bk+tmp[mxv];
		g[u][0].push_back(bk);
		g[u][2].push_back(bk2);
		//cout<<u<<' '<<v<<' '<<bkl<<' '<<bkl2<<endl;
	}
	ll vid=0;
	for(ll i=hd[u];i;i=es[i].nxt){
		//cout<<vid<<' '<<g[u][0].size()<<' '<<g[u][2].size()<<endl;
		ll v=es[i].to,w=es[i].w;
		if(v==fa) continue;
		dfs2(v,u,g[u][0][vid],g[u][2][vid],w);//todo
		++vid;
	}
}
int main(){
	scanf("%lld",&n);
	rep(i,1,n-1){
		ll u,v,w;
		scanf("%lld%lld%lld",&u,&v,&w);
		adde(u,v,w);
		adde(v,u,w);
	}
	tmp[0]=-INF;
	dfs(1,0);
	//cout<<f[1][0]<<endl;
	kk[1][0]=f[1][0];
	dfs2(1,0,0,0,0);
	printf("%lld\n",ans);
	return 0;
}

90pts 第7个点WA,求助

应该有人和我错同一个地方的吧(讨论里另一个90pts错的也是这个点)

2021/7/6 12:27
加载中...