奇葩错误求调
  • 板块学术版
  • 楼主__11jiang08__
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/1/28 10:53
  • 上次更新2023/10/24 02:52:12
查看原帖
奇葩错误求调
737038
__11jiang08__楼主2023/1/28 10:53

评测记录,目前基本确定是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;
}
2023/1/28 10:53
加载中...