RE 求调。
查看原帖
RE 求调。
868864
zjinze楼主2024/3/21 13:20

只需要告诉我为什么 RERE 即可。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+7;
int n,k,u,v,w,cur,siz[N],tot=0,temp[N],ans=0,a[N];
bool del[N];
vector< pair<int,int> >ve[N];
void dfs1(int x,int fa){
	siz[x]=1ll;
	int maxs=0ll;
	for(int j=0;j<ve[x].size();j++){
		int to=ve[x][j].first;
		if(del[to] || to==fa)continue;
		dfs1(to,x);
		if(cur!=-1)return ;
		maxs=max(maxs,siz[to]);
		siz[x]+=siz[to];
	}
	maxs=max(maxs,n-siz[x]);
	if(maxs<=n/2){
		cur=x;
		siz[fa]=n-siz[x];
	}
	return ;
}
void dfs2(int x,int fa,int len){
	++ans;
	temp[++tot]=len;
	for(int j=0;j<ve[x].size();j++){
		int to=ve[x][j].first;
		int w=ve[x][j].second;
		if(del[to] || to==fa || len<tot)continue;
		dfs2(to,x,len-tot+a[w]);
	}
	return ;
}
void run(int x){
	for(int j=0;j<ve[x].size();j++){
		int to=ve[x][j].first;
		int w=ve[x][j].second;
		if(del[to])continue;
		int tmp=tot;
		dfs2(to,x,a[to]);
		for(int i=tmp+1;i<=tot;i++){
			for(int j=1;j<=tmp;j++){
				if(temp[i]+temp[j]<=k)++ans;
			}
		}
	}
	tot=0;
	del[x]=true;
	for(int j=0;j<ve[x].size();j++){
		int to=ve[x][j].first;
		if(del[to])continue;
		cur=-1;
		n=siz[to];
		dfs1(to,x);
		run(cur);
	}
	return ;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		del[i]=false;
	}
	for(int i=1;i<n;i++){
		cin>>u>>v>>w;
		ve[u].push_back(make_pair(v,w));
		ve[v].push_back(make_pair(u,w));
	}
	cur=-1;
	dfs1(1,1);
	run(cur);
	cout<<ans<<"\n";
	return 0;
}	
2024/3/21 13:20
加载中...