我所有点 WA 的点提示信息都是 XXX violates the range 然而 expect2004 在讨论区发的 SPJ 代码里根本没有这样的输出。
就挺离谱的,我最小移动数都算对了为什么命令还能是错的。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=200004;
int n,x,y,av,maxd,a[maxn],anc[maxn];
struct item{ int a,b,c;};
vector< int > g[maxn],sd[maxn];
vector< item > cmd;
void dfs(int ver,int fa,int dep){
anc[ver]=fa;
maxd=max(maxd,dep);
sd[dep].push_back(ver);
for(int i:g[ver])
if(i!=fa)
dfs(i,ver,dep+1);
}
signed main(){
// freopen("P8900_2.in","r",stdin);
// freopen("8900.out","w",stdout);
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
av+=a[i];
}
av/=n;
for(int i=1;i<=n;i++)
a[i]-=av;
for(int i=1;i<n;i++){
scanf("%lld %lld",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
dfs(1,0,1);
for(int i=maxd;i;i--)
for(int j:sd[i]){
if(a[j]<0){
a[anc[j]]+=a[j];
cmd.push_back((item){anc[j],j,-a[j]});
continue;
}
if(a[j]>0){
a[anc[j]]+=a[j];
cmd.push_back((item){j,anc[j],a[j]});
}
}
printf("%d\n",cmd.size());
for(auto i:cmd)
printf("%lld %lld %lld\n",i.a,i.b,i.c);
return 0;
}
/*
9
10 7 6 12 21 11 2 14 7
1 2
2 5
2 3
3 4
3 8
8 9
3 7
1 6
*/