제출 #1005958

#제출 시각아이디문제언어결과실행 시간메모리
1005958vjudge1Dynamic Diameter (CEOI19_diameter)C++17
24 / 100
5063 ms20060 KiB
#include<bits/stdc++.h> using namespace std; using i64 = long long; using pil = pair<int, i64>; using pli = pair<i64, int>; const int N = 1e5 + 5; #define ALL(a) a.begin(), a.end() struct edge { int u, v; i64 w; edge(int u = 0, int v = 0, i64 w = 0) : u(u), v(v), w(w) {} }; int n; int tc; vector<pil> adj[N]; vector<edge> e; i64 ans = 0; i64 last = 0; i64 maxw = 0; vector<pli> best[N]; void DFS(int u, int p) { best[u].clear(); for(auto [v, w] : adj[u]) { if(v == p) continue; DFS(v, u); best[u].emplace_back(best[v].front().first + w, v); } best[u].emplace_back(0, u); while(best[u].size() < 2) best[u].emplace_back(0, 0); sort(ALL(best[u])); reverse(ALL(best[u])); while(best[u].size() > 2) best[u].pop_back(); } void GET(int u, int p, i64 cur) { ans = max(ans, best[u][0].first + best[u][1].first); ans = max(ans, cur + best[u][0].first); for(auto [v, w] : adj[u]) { if(v == p) continue; i64 b = max(cur, best[u].front().second == v ? best[u].back().first : best[u].front().first) + w; GET(v, u, b); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> tc >> maxw; for(int i = 1; i < n; i++) { int u, v; i64 w; cin >> u >> v >> w; e.emplace_back(u, v, w); } while(tc--) { int p; i64 w; cin >> p >> w; p = (p + last) % (n - 1); w = (w + last) % maxw; e[p].w = w; for(auto [u, v, w] : e) { // cout << u << " " << v << " " << w << "\n"; adj[u].emplace_back(v, w); adj[v].emplace_back(u, w); } ans = 0; DFS(1, 0); GET(1, 0, 0); cout << ans << "\n"; for(int i = 1; i <= n; i++) adj[i].clear(); last = ans; } }
#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...