求助wa+ac,悬一关
查看原帖
求助wa+ac,悬一关
1059675
fyc_LC楼主2024/10/22 23:16
#include<bits/stdc++.h>
using namespace std;
struct pt{
	int t,w1,w2;
};
vector<pt> t[300600];
int fa[300600][35],dep[300600];
long long cnt[300600];
int rd[300600];
long long v1[300600],v2[300600];
bool vis[300600];
long long ans;
void dfs(int f,int xz){
	vis[xz]=1;
	dep[xz]=dep[f]+1;
	fa[xz][0]=f;
	for(int i=1;i<=31;i++){
		fa[xz][i]=fa[fa[xz][i-1]][i-1];
	}
	int siz=t[xz].size();
	for(int i=0;i<siz;i++){
		if(vis[t[xz][i].t]==0){
			dfs(xz,t[xz][i].t);
		}
	}
}
int lca(int l,int r){
	if(dep[l]>dep[r]) swap(l,r);//r 深
	for(int i=31;i>=0;i--){
		if(dep[fa[r][i]]>=dep[l]){
			r=fa[r][i];
		}
	} 
	for(int i=31;i>=0;i--){
		if(fa[l][i]!=fa[r][i]){
			l=fa[l][i];
			r=fa[r][i];
		}
	}
	return fa[r][0];
}
void cb(int l,int r,int w1,int w2){
	int tmp=l;
	if(dep[l]<dep[r]) tmp=r;
	v1[tmp]=w1;
	v2[tmp]=w2;
}
void dfs2(int f,int xz){
	vis[xz]=1;
	int siz=t[xz].size();
	for(int i=0;i<siz;i++){
		cb(xz,t[xz][i].t,t[xz][i].w1,t[xz][i].w2);
		if(vis[t[xz][i].t]==0){
			dfs2(xz,t[xz][i].t);
		}
	}
	cnt[fa[xz][0]]+=cnt[xz];
}
int main(){
	int n;
	cin>>n;
	int a,b,c1,c2;
	pt tmp;
	for(int i=1;i<n;i++){
		cin>>a>>b>>c1>>c2;
		tmp.t=b,tmp.w1=c1,tmp.w2=c2;
		t[a].push_back(tmp);
		tmp.t=a;
		t[b].push_back(tmp);
	}
	dfs(0,1);
	for(int i=2;i<=n;i++){
		cnt[i]++;
		cnt[i-1]++;
		cnt[lca(i,i-1)]-=2;
	}
	memset(vis,0,sizeof(vis));
	dfs2(0,1);
	for(int i=1;i<=n;i++){
		ans+=min(cnt[i]*v1[i],v2[i]);
	}
	cout<<ans;
	return 0;
}

样例倒是全对了,但是wa+ac求大佬帮调

2024/10/22 23:16
加载中...