Submission #1204291

#TimeUsernameProblemLanguageResultExecution timeMemory
1204291peraClosing Time (IOI23_closing)C++20
21 / 100
1094 ms34792 KiB
#include "closing.h"
#include<bits/stdc++.h>
#define LL long long
#include <vector>
using namespace std;
int max_score(int N, int X, int Y, long long K,
              std::vector<int> U, std::vector<int> V, std::vector<int> W){
   ++X , ++Y;
   for(int i = 0;i < N - 1;i ++){
      ++U[i] , ++V[i];
   }
   vector<vector<pair<int , int>>> g(N + 1);
   for(int i = 0;i < N - 1;i ++){
      g[U[i]].emplace_back(V[i] , W[i]);
      g[V[i]].emplace_back(U[i] , W[i]);
   }
   int r;
   for(int i = 1;i <= N;i ++){
      if((int)g[i].size() == 1){
         r = i;
      }
   }
   int timer = 0;
   vector<int> o = {0} , id(N + 1);
   function<void(int , int)> dfs = [&](int u , int p){
      id[u] = ++timer;
      o.emplace_back(u);
      for(auto [v , w] : g[u]){
         if(v != p){
            dfs(v , u);
         }
      }
   };
   dfs(r , r);
   vector<vector<LL>> dist;
   function<void(int , int)> DFS = [&](int u , int p){
      for(auto [v , w] : g[u]){
         if(v != p){
            dist.back()[v] = dist.back()[u] + w;
            DFS(v , u);
         }
      }
   };
   dist.emplace_back(vector<LL>(N + 1));
   DFS(X , X);
   dist.emplace_back(vector<LL>(N + 1));
   DFS(Y , Y);
   vector<vector<LL>> sum(3 , vector<LL>(N + 1));
   for(int w = 0;w < 3;w ++){
      for(int i = 1;i <= N;i ++){
         LL val = 0;
         for(int c = 0;c < 2;c ++){
            if(c == w || w == 2){
               val = max(val , dist[c][o[i]]);
            }
         }
         sum[w][i] = sum[w][i - 1] + val;
      }
   }
   auto query = [&](int l , int r , int w){
      if(l > r){
         return 0LL;
      }
      return sum[w][r] - sum[w][l - 1];
   };
   auto calc = [&](int l1 , int r1 , int l2 , int r2){
      if(l1 > r2 || l2 > r1){
         return query(l1 , r1 , 0) + query(l2 , r2 , 1);
      }
      int L = max(l1 , l2) , R = min(r1 , r2);
      LL value = query(L , R , 2);
      if(l1 < L){
         value += query(l1 , min(r1 , L - 1) , 0);
      }
      if(r1 > R){
         value += query(max(l1 , R + 1) , r1 , 0);
      }
      if(l2 < L){
         value += query(l2 , min(r2 , L - 1) , 1);
      }
      if(r2 > R){
         value += query(max(l2 , R + 1) , r2 , 1);
      }
      return value;
   };
   int best = 0;
   for(int l1 = id[X];l1 >= 1;l1 --){
      for(int r1 = id[X];r1 <= N;r1 ++){
         int r2 = N;
         for(int l2 = id[Y];l2 >= 1;l2--){
            while(calc(l1 , r1 , l2 , r2) > K && r2 >= id[Y]){
               --r2;
            }
            if(r2 >= id[Y]){
               best = max(best , r1 - l1 + 1 + r2 - l2 + 1);
            }
         }
      }
   }
   return best;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...