求调/hack
查看原帖
求调/hack
333855
int233楼主2024/7/4 18:52
#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
vector<pair<ll,ll> > G[200005];
ll n,a[200005],u,v,w,fa[200005],h[200005],cnt,c[200005],flg=1,ans;
struct node{
	ll v1,col1,v2,col2;
}f[200005][2],pre[200005],suf[200005];
pair<ll,ll> mn[200005];
node _PrePare(){
	node z;
	z.col1=z.col2=0;
	z.v1=z.v2=1e17;
	return z;
}
node adds(node x,ll y){
	x.v1+=y;
	x.v2+=y;
	return x;
}
node mknd(ll x,ll y){
	node z;
	z.v2=1e17;
	z.col2=0;
	z.v1=x,z.col1=y;
	return z;
}
node merges(node x,ll y,ll z){
	node ret=x;
	if(y<ret.v1){
		if(z==ret.col1){
			ret.v1=y;
		}
		else{
			ret.v2=ret.v1;
			ret.col2=ret.col1;
			ret.v1=y;
			ret.col1=z;
		}
	}
	else if(y<ret.v2){
		ret.v2=y;
		ret.col2=z;
	}
	return ret;
}
node merge(node x,node y){
	node z=x;
	z=merges(z,y.v1,y.col1);
	z=merges(z,y.v2,y.col2);
	return z;
}
ll find(ll x){
	if(x==fa[x]){
		return x;
	}
	return fa[x]=find(fa[x]);
}
void dfs(ll x,ll fat){
	for(ll i=0;i<G[x].size();i++){
		if(G[x][i].first==fat){
			continue;
		}
		dfs(G[x][i].first,x);
		f[x][0]=merge(f[x][0],adds(f[G[x][i].first][0],G[x][i].second)); 
		f[x][0]=merge(f[x][0],mknd(G[x][i].second+a[G[x][i].first],c[G[x][i].first]));
	}
}
void dfs2(ll x,ll fat){
	if(G[x][0].first==fat){
		pre[0]=_PrePare();
	}
	else{
		pre[0]=adds(f[G[x][0].first][0],G[x][0].second);
		pre[0]=merge(pre[0],mknd(G[x][0].second+a[G[x][0].first],c[G[x][0].first]));
	}
	ll m=(ll)G[x].size();
	for(ll i=1;i<m;i++){
		pre[i]=pre[i-1];
		if(G[x][i].first==fat){
			continue;
		}
		pre[i]=merge(pre[i],adds(f[G[x][i].first][0],G[x][i].second));
		pre[i]=merge(pre[i],mknd(G[x][i].second+a[G[x][i].first],c[G[x][i].first]));
	}//-----------------------------------------
	if(G[x][m-1].first==fat){
		suf[m-1]=_PrePare();
	}
	else{
		suf[m-1]=adds(f[G[x][m-1].first][0],G[x][m-1].second);
		suf[m-1]=merge(pre[m-1],mknd(G[x][m-1].second+a[G[x][m-1].first],c[G[x][m-1].first]));
	}
	for(ll i=m-2;i>=0;i--){
		suf[i]=suf[i+1];
		if(G[x][i].first==fat){
			continue;
		}
		suf[i]=merge(suf[i],adds(f[G[x][i].first][0],G[x][i].second));
		suf[i]=merge(suf[i],mknd(G[x][i].second+a[G[x][i].first],c[G[x][i].first]));
	}
	for(ll i=0;i<G[x].size();i++){
		if(G[x][i].first==fat){
			continue;
		}
		f[G[x][i].first][1]=adds(f[x][1],G[x][i].second);
		f[G[x][i].first][1]=merge(f[G[x][i].first][1],mknd(a[x]+G[x][i].second,c[x]));
		if(i>=1){
			f[G[x][i].first][1]=merge(f[G[x][i].first][1],adds(pre[i-1],G[x][i].second));
		}
		if(i+1<m){
			f[G[x][i].first][1]=merge(f[G[x][i].first][1],adds(suf[i+1],G[x][i].second));
		}  
		dfs2(G[x][i].first,x);
	}
}
int main(){
	cin>>n;
	for(ll i=1;i<=n;i++){
		cin>>a[i];
		c[i]=i;
		fa[i]=i;
	}
	for(ll i=1;i<=n-1;i++){
		cin>>u>>v>>w;
		G[u].push_back({v,w});
		G[v].push_back({u,w});
	}
	while(1){
		cnt++;
		flg=1;
		for(ll i=1;i<=n;i++){
			mn[i]={1e17,0};
			c[i]=find(i);
			h[i]=0;
			if(c[i]!=c[1]){
				flg=0;
			}
		}
		if(flg){
			break;
		}
		for(ll i=1;i<=n;i++){
			h[c[i]]++;
			f[i][0]=f[i][1]=_PrePare();
		}
		dfs(1,0);
		dfs2(1,0);
		for(ll i=1;i<=n;i++){
			node F=merge(f[i][0],f[i][1]);
			F=adds(F,a[i]);
			if(F.col1!=c[i]&&F.col1){
				mn[c[i]]=min(mn[c[i]],{F.v1,F.col1}); 
			}
			if(F.col2!=c[i]&&F.col2){
				mn[c[i]]=min(mn[c[i]],{F.v2,F.col2}); 
			}
		}
		for(ll i=1;i<=n;i++){
			if(h[i]){
				if(mn[i].first<=1e16){
					if(find(i)!=find(mn[i].second)){
						ans+=mn[i].first;
						//cout<<i<<" "<<mn[i].second<<" Round "<<cnt<<" "<<mn[i].first<<" "<<f[3][1].v1<<" "<<f[3][1].col1<<endl;
						fa[find(i)]=find(mn[i].second);
					}
				}
			}
		}
		//cout<<ans;
	}
	cout<<ans;
	return 0;
} 

能帮着调调或者给组hack都行。

2024/7/4 18:52
加载中...