萌新刚学OI
查看原帖
萌新刚学OI
370648
柠檬布丁吖楼主2023/1/31 13:58
#include<bits/stdc++.h>

using namespace std;

#define int long long

inline int read() {
	int ret=0,f=1;
	char c=getchar();
	for(; c<'0'||c>'9'; c=getchar()) if(c=='-') f=-f;
	for(; c>='0'&&c<='9'; c=getchar()) ret=ret*10+c-'0';
	return ret*f;
}

int N;
const int maxn=2e5+15;
int a[maxn];
int head[maxn],ne[maxn<<1],to[maxn<<1],tot;
struct _cow {
	int u,v,cnt;
}ans[maxn<<1];
void add(int u,int v) {
	to[tot]=v;
	ne[u]=head[u];
	head[u]=tot++;
}


int num,cow[maxn],now[maxn],sum[maxn];
void _num(int u,int fa) {
	cow[u]=1;
	sum[u]=now[u];
	int i;
	for(i=head[u]; ~i; i=ne[i]) {
		if(to[i]==fa) continue;
		_num(to[i],u);
		cow[u]+=cow[to[i]];
		sum[u]+=sum[to[i]];
	}

	if(u==1) {
		num=sum[u]/N;
	}
}

int m=0;
void solve(int u,int fa) {
	for(int i=head[u]; ~i; i=ne[i]) {
		if(to[i]==fa || sum[to[i]]<cow[to[i]]*num) continue;
		solve(to[i],u);
		if(now[to[i]]>num) {
//			ans[++m]= {to[i],u,now[to[i]]-num};
			ans[++m].u=to[i];
			ans[m].v=u;
			ans[m].cnt=now[to[i]]-num;
			sum[to[i]]-=now[to[i]]-num;
			now[u]+=now[to[i]]-num;
			now[to[i]]=num;
		}
	}

	for(int i=head[u]; ~i; i=ne[i]) {
		if(to[i]==fa || sum[to[i]]==cow[to[i]]*num) continue;
//		ans[++m]= {u,to[i],cow[to[i]]*num-num};
		ans[++m].u=u;
		ans[m].v=to[i];
		ans[m].cnt=cow[to[i]]*num-num;
		sum[to[i]]=cow[to[i]]*num;
		now[u]-=cow[to[i]]*num-sum[to[i]];
		now[to[i]]=cow[to[i]]*num;
		solve(to[i],u);
	}
}

signed main(void) {

	N=read();

	for(int i=1; i<=N; i++) {
		a[i]=read();
	}

	for(int i=1; i<N; i++) {
		int u,v;
		u=read();
		v=read();
		add(u,v);
		add(v,u);
	}

	_num(1,-1);
	solve(1,-1);
	
	printf("%d\n",m);
	for(int i=1;i<=m;i++)	printf("%d %d %lld\n",ans[i].u,ans[i].v,ans[i].cnt);

	return 0;
}
2023/1/31 13:58
加载中...