제출 #1268962

#제출 시각아이디문제언어결과실행 시간메모리
1268962BahaminDynamic Diameter (CEOI19_diameter)C++17
24 / 100
252 ms54100 KiB
#include "bits/stdc++.h" using namespace std; template<typename A> ostream& operator<<(ostream& os, vector<A> x) {os << "{"; string sep; for (A y : x) os << sep << y, sep = ", "; return os << "}";} #define all(a) (a).begin(), (a).end() #define ll long long #define lid id << 1 #define rid id << 1 | 1 #define mid ((r + l) >> 1) const int MAX_N = 1e5 + 5; const int MOD = 1e9 + 7; const ll INF = 1e18; const int LOG = 30; ll ps[MAX_N]; vector<pair<int, ll>> adj[MAX_N]; vector<int> al; int st[MAX_N]; int fi[MAX_N]; ll w1[MAX_N]; int u1[MAX_N], v1[MAX_N]; int h[MAX_N]; void dfs(int u, int p) { st[u] = al.size(); al.push_back(u); for (auto v : adj[u]) if (v.first != p) h[v.first] = h[u] + v.second, ps[v.first] = ps[u] + v.second, dfs(v.first, u), al.push_back(u); fi[u] = al.size(); } struct node { ll ans[3][3]; node(){}; }; node merge(node x, node y) { node re; for (int i = 0; i < 3; i++) for (int j = i; j < 3; j++) { re.ans[i][j] = max(x.ans[i][j], y.ans[i][j]); for (int p = i; p < j; p++) re.ans[i][j] = max(re.ans[i][j], x.ans[i][p] + y.ans[p + 1][j]); } return re; } node seg[MAX_N << 3]; ll ops[MAX_N << 2]; void build(int l, int r, int id) { if (l == r - 1) { for (int i = 0; i < 3; i++) { int sum = 0; for (int j = i; j < 3; j++) { if (j == 1) sum -= 2; else sum++; seg[id].ans[i][j] = 1ll * sum * ps[al[l]]; } } return; } build(l, mid, lid); build(mid, r, rid); seg[id] = merge(seg[lid], seg[rid]); } void move(int l, int r, int id) { if (l == r - 1) return; for (int i = 0; i < 3; i++) { int sum = 0; for (int j = i; j < 3; j++) { if (j == 1) sum -= 2; else sum++; seg[lid].ans[i][j] += 1ll * sum * ops[id]; seg[rid].ans[i][j] += 1ll * sum * ops[id]; } } ops[lid] += ops[id]; ops[rid] += ops[id]; ops[id] = 0; } void upd(int s, int t, ll x, int l, int r, int id) { move(l, r, id); if (s <= l && t >= r) { ops[id] += x; for (int i = 0; i < 3; i++) { int sum = 0; for (int j = i; j < 3; j++) { if (j == 1) sum -= 2; else sum++; seg[id].ans[i][j] += 1ll * sum * x; } } return; } if (s < mid) upd(s, t, x, l, mid, lid); if (t > mid) upd(s, t, x, mid, r, rid); seg[id] = merge(seg[lid], seg[rid]); } void solve() { int n, q; cin >> n >> q; ll w; cin >> w; ll last = 0; for (int i = 0; i < n - 1; i++) { cin >> u1[i] >> v1[i] >> w1[i]; adj[u1[i]].push_back({v1[i], w1[i]}); adj[v1[i]].push_back({u1[i], w1[i]}); } dfs(1, 0); build(0, al.size(), 1); while (q--) { int d; ll e; cin >> d >> e; d = (d + last) % (n - 1); e = (e + last) % w; if (h[u1[d]] > h[v1[d]]) swap(u1[d], v1[d]); upd(st[v1[d]], fi[v1[d]], e - w1[d], 0, al.size(), 1); w1[d] = e; cout << (last = seg[1].ans[0][2]) << endl; } } int main() { cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false); int tc = 1; // cin >> tc; while (tc--) solve(); }
#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...