/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 1ms 320.0 KiB
#2 Accepted 30ms 660.0 KiB
#3 Accepted 28ms 664.0 KiB
#4 Accepted 5ms 1.066 MiB
#5 Accepted 28ms 576.0 KiB
#6 Accepted 130ms 2.094 MiB
#7 Accepted 146ms 2.047 MiB
#8 Accepted 123ms 2.082 MiB
#9 Accepted 149ms 5.441 MiB
#10 Accepted 60ms 14.906 MiB
#11 Accepted 61ms 14.914 MiB
#12 Accepted 106ms 15.031 MiB
#13 Accepted 77ms 15.422 MiB
#14 Accepted 185ms 31.422 MiB
#15 Accepted 194ms 31.574 MiB
#16 Accepted 119ms 2.035 MiB

Code

#include<bits/stdc++.h>

using namespace std;
using pl=pair<long long,long long>;
using Graph=vector<vector<pl>>;

int main(){
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int t;
  cin >> t;
  while(t>0){
    t--;
    long long n;
    cin >> n;
    vector<long long> a(n);
    for(auto &nx : a){cin >> nx;}
    Graph g(n);
    for(long long i=1;i<n;i++){
      long long u,v,w;
      cin >> u >> v >> w;
      u--; v--; w*=-2;
      g[u].push_back({v,w});
      g[v].push_back({u,w});
    }
    queue<long long> q;
    vector<long long> sq;
    vector<long long> par(n,-1);
    q.push(0);
    par[0]=-2;
    while(!q.empty()){
      auto od=q.front(); q.pop();
      sq.push_back(od);
      for(auto &nx : g[od]){
        if(par[nx.first]==-1){
          par[nx.first]=od;
          q.push(nx.first);
        }
      }
    }
    long long res=-8e18;
    reverse(sq.begin(),sq.end());

    // distinct path
    {
      vector<long long> dp(n,-8e18);
      for(auto &v : sq){
        vector<long long> mem;
        for(auto &w : g[v]){
          if(w.first==par[v]){continue;}
          mem.push_back(dp[w.first]+w.second);
        }
        sort(mem.rbegin(),mem.rend());
        if(mem.size()>=2){
          res=max(res,mem[0]+mem[1]+a[v]);
        }
        dp[v]=0;
        if(mem.size()>=1){
          dp[v]=max(dp[v],mem[0]);
        }
        dp[v]+=a[v];
      }
    }

    // parent-children
    {
      vector<vector<long long>> dp(n,vector<long long>(2,-8e18));
      for(auto &v : sq){
        for(auto &w : g[v]){
          if(w.first==par[v]){continue;}
          long long del=w.second+a[v];
          res=max(res,dp[w.first][1]+del);
          dp[v][1]=max(dp[v][1],max(dp[w.first][0],dp[w.first][1])+del);
        }
        dp[v][0]=a[v];
        // cerr << v << " " << dp[v][0] << " " << dp[v][1] << "\n";
      }
    }
    cout << res << "\n";
  }
  return 0;
}

Information

Submit By
Type
Submission
Problem
P1205 E. Make Cycle in Tree
Contest
Educational Round 1
Language
C++17 (G++ 13.2.0)
Submit At
2025-07-14 16:18:32
Judged At
2025-07-14 16:18:32
Judged By
Score
100
Total Time
194ms
Peak Memory
31.574 MiB