/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 5ms 584.0 KiB
#2 Accepted 5ms 532.0 KiB
#3 Accepted 5ms 580.0 KiB
#4 Accepted 7ms 532.0 KiB
#5 Accepted 33ms 2.641 MiB
#6 Accepted 53ms 2.832 MiB
#7 Accepted 44ms 2.816 MiB
#8 Accepted 22ms 620.0 KiB
#9 Accepted 46ms 896.0 KiB
#10 Accepted 61ms 2.773 MiB
#11 Accepted 46ms 2.957 MiB
#12 Accepted 51ms 2.633 MiB
#13 Accepted 26ms 2.812 MiB
#14 Accepted 71ms 2.945 MiB
#15 Accepted 30ms 1008.0 KiB
#16 Accepted 26ms 2.738 MiB
#17 Accepted 23ms 2.777 MiB
#18 Accepted 24ms 2.762 MiB
#19 Accepted 75ms 15.855 MiB
#20 Accepted 72ms 15.82 MiB
#21 Accepted 69ms 15.852 MiB
#22 Accepted 88ms 27.211 MiB
#23 Accepted 138ms 15.215 MiB
#24 Accepted 144ms 15.094 MiB
#25 Accepted 86ms 15.055 MiB
#26 Accepted 9ms 1.594 MiB

Code

#include<bits/stdc++.h>
using namespace std;
const long long M=3e5+10,MOD=1000000000;
typedef long long ll;
vector<int>edge[M];
int level[M];
int d[M];
ll sum[M];
int arr[M];
void dfs1(int x,int p){
    for(int u:edge[x]){
        if(u!=p){
            d[u]=d[x]+1;
            dfs1(u,x);
        }
    }
}
void dfs(int x,int p){
    for(int u:edge[x]){
        if(u!=p){
            d[u]=d[x]+1;
            dfs(u,x);
        }
    }
    level[p]+=level[x];
    sum[p]+=sum[x]+(2*min(1,level[x]));
    
}
void clear_edge(int n){
    for(int i=0;i<=n;i++){
        edge[i].clear();
        sum[i]=0;
        level[i]=0;
        d[i]=0;
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t=1;
    cin>>t;
    while(t--){
     int n;
     cin>>n;
     int cnt=0;
     clear_edge(n);
     int node=1;
     for(int i=1;i<=n;i++){
        cin>>level[i];
        cnt+=level[i];
        arr[i]=level[i];
        if(arr[i])node=i;
     }
     for(int i=1;i<n;i++){
        int x,y;
        cin>>x>>y;
        edge[x].push_back(y);
        edge[y].push_back(x);
     }
     if(cnt<=1){
        cout<<0<<"\n";
        continue;
     }
     dfs(node,0);
     int cur=1;
     int mx_dis=0;
     for(int i=1;i<=n;i++){
        if(mx_dis<d[i] && arr[i]){
            mx_dis=d[i];
            cur=i;
        }
        d[i]=0;
     }
     dfs1(cur,0);
     int maximum_dis=0;
     for(int i=1;i<=n;i++)if(arr[i])maximum_dis=max(maximum_dis,d[i]);
     cout<<sum[node]-maximum_dis<<"\n";
    


    }




    
   
   return 0;
 
}

Information

Submit By
Type
Submission
Problem
P1078 Apple on Tree
Language
C++20 (G++ 13.2.0)
Submit At
2024-07-29 22:32:29
Judged At
2024-12-17 11:28:45
Judged By
Score
100
Total Time
144ms
Peak Memory
27.211 MiB