社区讨论

60 pts求调

P8900[USACO22DEC] Barn Tree S参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mhj9f34a
此快照首次捕获于
2025/11/03 22:53
4 个月前
此快照最后确认于
2025/11/03 22:53
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define For(i,u,G) for(int i=G.head[u];i;i=G.nex[i])
#define int __int128
using namespace std;
#define out(n) putchar(n)
void read(int &x) {
	x=0;
	char y=getchar_unlocked();
	bool flag=0;
	while(y<'0' || y>'9') {
		if(y=='-')flag=1;
		y=getchar_unlocked();
	}
	while((y>='0' && y<='9')) {
		x=(x<<1)+(x<<3)+(y-'0');
		y=getchar_unlocked();
	}
	if(flag)x=-x;
}
void write(int x) {
	if(x<0) {
		putchar('-');
		x=-x;
	}
	if(x<10)putchar(x+'0');
	else {
		write(x/10);
		out(x%10+'0');
	}
}
struct edge{
	int u,v;
};
vector<int>G[400005];
int n,a[200005],u,v,sum,maxid,dp[200005];
bool cmp(int x,int y){
	return dp[x]>dp[y];
}
void dfs1(int u,int fa){
	dp[u]=a[u]-sum;
	int v;
	for(int i=0;i<G[u].size();i++){
		v=G[u][i];
		if(v==fa)continue;
		dfs1(v,u);
		dp[u]+=dp[v];
	}
	sort(G[u].begin(),G[u].end(),cmp);
}
struct ANS{
	int x,y,z;
};
queue<ANS>ans;
void dfs2(int u,int fa){
	int v;
	for(int i=0;i<G[u].size();i++){
		v=G[u][i];
		if(v==fa)continue;
		if(dp[v]==0)continue;
		else if(dp[v]>0){
			dfs2(v,u);
			ans.push({v,u,dp[v]});
		}else{
			ans.push({u,v,-dp[v]});
			dfs2(v,u);
		}
	}
}
signed main(){
	read(n);
	for(int i=1;i<=n;i++){
		read(a[i]);
		sum+=a[i];
	}
	for(int i=1;i<n;i++){
		read(u);
		read(v);
		G[u].push_back(v);
		G[v].push_back(u);
	}
	sum/=n;
    maxid=rand()%n+1;
	dfs1(maxid,0);
	dfs2(maxid,0);
	write(ans.size());
	while(ans.size()){
		putchar('\n');
		write(ans.front().x);
		putchar(' ');
		write(ans.front().y);
		putchar(' ');
		write(ans.front().z);
		ans.pop();
	}
	return 0;
}
/*
in:
6
3 4 4 5 5 9
1 2
1 4
1 6
3 6
2 5
out:
3
6 3 1
6 1 3
1 2 1

in:
8
1 9 1 13 1 9 1 5
1 2 2 3 2 4 4 8 8 5 4 6 4 7
out:
*/

回复

5 条回复,欢迎继续交流。

正在加载回复...