评测记录,目前基本确定是calcu函数越界(函数返回值3221225725)。但看不出哪里越界
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
int n;
vector<ll> to[200009];
ll h[200009];
ll cnt[200009],s[200009];
ll aim,cnt1;
ll a[400009],b[400009],c[400009];
void calcu(ll x,ll fa){
cnt[x]=1,s[x]=h[x];
for(ll i=0;i<to[x].size();i++){
ll v=to[x][i];
if(v==fa) continue;
calcu(v,x);
cnt[x]+=cnt[v];
s[x]+=s[v];
}
return ;
}
void dfs(ll x,ll fa){
for(ll i=0;i<to[x].size();i++){
ll v=to[x][i];
if(v==fa||aim*cnt[v]>=s[v]) continue;
dfs(v,x);
}
for(ll i=0;i<to[x].size();i++){
ll v=to[x][i];
if(v==fa||aim*cnt[v]<s[v]) continue;
cnt1++;
a[cnt1]=x;
b[cnt1]=v;
c[cnt1]=aim*cnt[v]-s[v];
h[v]+=(aim*cnt[v]-s[v]);
h[x]-=(aim*cnt[v]-s[v]);
s[v]=aim*cnt[v];
dfs(v,x);
}
if(h[x]!=aim){
cnt1++;
a[cnt1]=x;
b[cnt1]=fa;
c[cnt1]=h[x]-aim;
}
h[fa]+=(h[x]-aim);
s[fa]+=(h[x]-aim);
h[x]=aim;
return ;
}
int main(){
freopen("P8900_11.in","r",stdin);
cin>>n;
for(ll i=1;i<=n;i++) cin>>h[i];
for(ll i=1;i<=n-1;i++){
ll u,v;
cin>>u>>v;
to[u].push_back(v);
to[v].push_back(u);
}
cout<<1; //test
calcu(1,0);
cout<<2; //test
aim=s[1]/n;
dfs(1,0);
cout<<cnt1<<endl;
for(ll i=1;i<=cnt1;i++) cout<<a[i]<<" "<<b[i]<<" "<<c[i]<<endl;
return 0;
}