제출 #1204291

#제출 시각아이디문제언어결과실행 시간메모리
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...