(UPD: 2024-12-04 14:48 UTC) Judge is not working due to Cloudflare incident. (URL) We can do nothing about it, sorry. After the incident is resolved, we will grade all submissions.

제출 #1119498

#제출 시각아이디문제언어결과실행 시간메모리
1119498mmdrzadaDynamic Diameter (CEOI19_diameter)C++17
100 / 100
686 ms91188 KiB
#include <bits/stdc++.h> using namespace std; #define int long long typedef vector<int> vi; typedef vector<char> vc; typedef pair<int, int> pii; typedef long long ll; typedef pair<ll, ll> pll; typedef vector<ll> vll; #define sep ' ' #define F first #define S second #define fastIO ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define pb push_back #define kill(x) {cout << x << endl;return;} #define sz(x) int(x.size()) #define SP(x) setprecision(x) #define mod(x) (1ll*x%M+M)%M #define pq priority_queue #define mid (l+r)/2 // #define mid2 (l+r+1)/2 #define pll pair<ll, ll> #define REP(i, k) for (int i = 0 ; i < k ; i ++) #define MP make_pair struct Node { ll a, b, c, d, e, lazy; Node () { a = b = c = d = e = -2e18; lazy = 0; } }; const int M = 998244353; const int N = 3e5+10; int n, q; ll W; vector<pair<int, ll>> adj[N]; ll h[N]; vector<pii> E, SE; int st[N], fn[N]; vector<int> order; Node node[N<<2]; vector<ll> Ws; ll weight[N]; Node merge(Node x, Node y) { Node res; res.a = max(x.a, y.a); res.b = max(x.b, y.b); res.c = max({x.c, x.a + y.b, y.c}); res.d = max({x.d, x.b + y.a, y.d}); res.e = max({x.e, x.c + y.a, x.a + y.d, y.e}); return res; } void dolazy(int id) { ll C = node[id].lazy; node[id].lazy = 0; vector<ll> ids = {2*id, 2*id+1}; for(auto i: ids) { node[i].lazy += C; node[i].a += C; node[i].b -= 2*C; node[i].c -= C; node[i].d -= C; } } int ID(int u, int v) { if (u > v) swap(u, v); return lower_bound(SE.begin(), SE.end(), MP(u, v)) - SE.begin(); } void dfs(int v = 0, int p = -1) { for(auto [neigh, w]: adj[v]) { if (neigh == p) continue; h[neigh] = 0ll + h[v] + w; order.pb(h[v]); st[ID(v, neigh)] = order.size(); dfs(neigh, v); fn[ID(v, neigh)] = order.size(); } order.pb(h[v]); } void build(int l = 0, int r = n, int id = 1) { if (r-l == 1) { node[id].a = order[l]; node[id].b = -2ll*order[l]; node[id].c = node[id].d = -order[l]; node[id].e = 0; return; } build(l, mid, 2*id), build(mid, r, 2*id+1); node[id] = merge(node[2*id], node[2*id+1]); } void upd(int L, int R, ll C, int l=0, int r=n, int id=1) { if (R <= l || r <= L) return; if (L <= l && r <= R) { node[id].lazy += C; node[id].a += C; node[id].b -= 2*C; node[id].c -= C; node[id].d -= C; return; } dolazy(id); upd(L, R, C, l, mid, 2*id), upd(L, R, C, mid, r, 2*id+1); node[id] = merge(node[2*id], node[2*id+1]); } int get(int ind, int l=0, int r=n, int id=1) { if (r-l == 1) return node[id].a; dolazy(id); if (ind < mid) return get(ind, l, mid, 2*id); return get(ind, mid, r, 2*id+1); } void fulldata(int l=0, int r=n, int id=1) { cout << id << sep << l << sep << r << sep << node[id].a << sep << node[id].b << sep << node[id].e << endl; if (r-l > 1) fulldata(l, mid, 2*id), fulldata(mid, r, 2*id+1); } void solve() { cin >> n >> q >> W; int m = n; for(int i = 0 ; i < n-1 ; i ++) { int u, v, w; cin >> u >> v >> w; u--, v--; if (u > v) swap(u, v); adj[u].pb({v, w}), adj[v].pb({u, w}); Ws.pb(w); E.pb({u, v}); } SE = E; sort(SE.begin(), SE.end()); for(int i = 0 ; i < n-1 ; i ++) { auto [u, v] = E[i]; weight[ID(u, v)] = Ws[i]; } dfs(); n = 2*n-1; build(); ll last = 0; while(q--) { ll d, w; cin >> d >> w; d = (0ll + d + last) % (m-1); w = (0ll + w + last) % W; auto [u, v] = E[d]; int id = ID(u, v); int s = st[id], f = fn[id]; // [s, f) upd(s, f, 0ll + w - weight[id]); weight[id] = w; cout << node[1].e << endl; last = node[1].e; } } // check MAXN int32_t main() { fastIO; solve(); return 0; }
#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...