Submission #716484

#TimeUsernameProblemLanguageResultExecution timeMemory
716484ajab_01Dynamic Diameter (CEOI19_diameter)C++17
49 / 100
1710 ms46972 KiB
#include<bits/stdc++.h> using namespace std; #define int long long const int N = 1e5 + 5; vector<pair<pair<int , int> , int> > edge; vector<pair<int , int> > g[N]; int dp[N] , val[N] , level[N] , d , e , n , q , w , last , star = -1; bool ch = 1; multiset<int , greater<int>> st; priority_queue<pair<int , int>> pq; void dfs(int ver , int par){ for(auto i : g[ver]){ int uu = i.first , ww = i.second; if(uu == par) continue; level[uu] = level[ver] + ww; dfs(uu , ver); } } void cal(){ for(int i = 1 ; i <= n ; i++) g[i].clear(); for(auto i : edge){ int U = i.first.first , V = i.first.second , W = i.second; g[U].push_back({V , W}); g[V].push_back({U , W}); } dfs(1 , 0); int mx = 0 , vr = 1; for(int i = 1 ; i <= n ; i++){ if(mx < level[i]){ mx = level[i]; vr = i; } } level[vr] = 0; dfs(vr , 0); mx = 0; for(int i = 1 ; i <= n ; i++) mx = max(mx , level[i]); cout << mx << '\n'; last = mx; return; } void solve1(){ while(q--){ cin >> d >> e; d = (d + last) % (n - 1); e = (e + last) % w; pair<pair<int , int> , int> p; p = edge[d]; p.second = e; swap(edge[d] , p); cal(); } } void solve2(){ for(auto i : edge) st.insert(i.second); while(q--){ cin >> d >> e; d = (d + last) % (n - 1); e = (e + last) % w; st.erase(st.find(edge[d].second)); pair<pair<int , int> , int> p; p = edge[d]; p.second = e; swap(edge[d] , p); st.insert(e); last = *st.begin() + *next(st.begin()); cout << last << '\n'; } } void solve3(){ for(int i = n / 2 ; i >= 1 ; i--){ dp[i] = max(dp[i << 1] + val[i << 1] , dp[i << 1 | 1] + val[i << 1 | 1]); pq.push({dp[i << 1] + dp[i << 1 | 1] + val[i << 1] + val[i << 1 | 1] , i}); } while(q--){ cin >> d >> e; d = (d + last) % (n - 1); e = (e + last) % w; int ver = edge[d].first.second; val[ver] = e; while(ver != 1){ ver >>= 1; dp[ver] = max(dp[ver << 1] + val[ver << 1] , dp[ver << 1 | 1] + val[ver << 1 | 1]); pq.push({dp[ver << 1] + dp[ver << 1 | 1] + val[ver << 1] + val[ver << 1 | 1] , ver}); } while(!pq.empty()){ pair<int , int> p = pq.top(); int vl = p.first , vr = p.second; if(dp[vr << 1] + dp[vr << 1 | 1] + val[vr << 1] + val[vr << 1 | 1] == vl) break; pq.pop(); } last = pq.top().first; cout << last << '\n'; } } int32_t main(){ ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin >> n >> q >> w; for(int i = 0 ; i < n - 1 ; i++){ int U , V , W; cin >> U >> V >> W; g[U].push_back({V , W}); g[V].push_back({U , W}); if(U > V) swap(U , V); edge.push_back({{U , V} , W}); if(g[U].size() == n - 1) star = U; if(g[V].size() == n - 1) star = V; if(abs(V - 2 * U) > 1) ch = 0; val[V] = W; } if(n <= 5000 && q <= 5000){ solve1(); return 0; } if(star != -1){ solve2(); return 0; } if(ch){ solve3(); return 0; } return 0; }

Compilation message (stderr)

diameter.cpp: In function 'int32_t main()':
diameter.cpp:123:18: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
  123 |   if(g[U].size() == n - 1) star = U;
      |      ~~~~~~~~~~~~^~~~~~~~
diameter.cpp:124:18: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
  124 |   if(g[V].size() == n - 1) star = V;
      |      ~~~~~~~~~~~~^~~~~~~~
#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...