80分,测试点5怎么就RE了呢qwq
查看原帖
80分,测试点5怎么就RE了呢qwq
450717
Akie_Qs楼主2022/2/7 14:01
#include<iostream>

#include<cmath>
#include<cstring>
#include <iomanip>
#include<queue>
#define N 111
using namespace std;
typedef long long ll;

int n;
ll tsize;

struct node
{
    int val,lc,rc;
};

ll nodesum(struct node node[N],int root)
{
    ll sum=node[root].val;
    if(node[root].lc) sum+=nodesum(node,node[root].lc);
    if(node[root].rc) sum+=nodesum(node,node[root].rc);
    return sum;
}
ll initmin(struct node node[N],ll min,int root,int deep)
{
    min+=node[root].val * deep;
    if(node[root].lc) min=initmin(node,min,node[root].lc,deep+1);
    if(node[root].rc) min=initmin(node,min,node[root].rc,deep+1);
    return min;
}

ll mdis(struct node node[N],int root,int min)
{
    ll x=nodesum(node,node[root].lc)+nodesum(node,node[root].rc);//不动
    ll y=tsize-nodesum(node,root)+node[root].val+2*nodesum(node,node[root].rc);//左移
    ll z=tsize-nodesum(node,root)+node[root].val+2*nodesum(node,node[root].lc);//右移

    
    if(y<x && y<z) return mdis(node,node[root].lc,min-2*nodesum(node,node[root].lc)+tsize);
    else if(z<x && z<y) return mdis(node,node[root].rc,min-2*nodesum(node,node[root].rc)+tsize);
    else return min;
}

int main()
{
    ll min=0;
    struct node resident[N];
    
    cin>>n;
    for(int i=1;i<=n;i++) cin>>resident[i].val>>resident[i].lc>>resident[i].rc;

    tsize=nodesum(resident,1);
    min=initmin(resident,0,1,0);
   
    min=mdis(resident,1,min);

    
    cout<<min;
    
    return 0;
}

2022/2/7 14:01
加载中...