Submission #554221

#TimeUsernameProblemLanguageResultExecution timeMemory
554221amunduzbaevReconstruction Project (JOI22_reconstruction)C++17
0 / 100
1299 ms165288 KiB
#include "bits/stdc++.h" using namespace std; #define ar array const int N = 1e5 + 5; const int M = 1e9 + 5; const int MAXN = 505; struct ST{ long long tree[N * 25]; int ch[N * 25][2], last; ST(){ last = 0; } int bala(int x, int t){ if(!ch[x][t]){ ch[x][t] = ++last; } return ch[x][t]; } void add(int l, int r, int v, int lx = 0, int rx = M, int x = 0){ if(lx > r || rx < l) return; if(lx >= l && rx <= r){ tree[x] += v; return; } int m = (lx + rx) >> 1; add(l, r, v, lx, m, bala(x, 0)); add(l, r, v, m+1, rx, bala(x, 1)); } int get(int i, int lx = 0, int rx = M, int x = 0){ if(lx == rx) return tree[x]; int m = (lx + rx) >> 1; if(i <= m && ch[x][0]) return tree[x] + get(i, lx, m, ch[x][0]); if(m < i && ch[x][1]) return tree[x] + get(i, m+1, rx, ch[x][1]); return tree[x]; } }tree, cnt; int a[N], b[N], w[N]; int l[N], r[N]; set<int> edges[MAXN]; signed main(){ ios::sync_with_stdio(0); cin.tie(0); int n, m; cin>>n>>m; vector<int> p(m); for(int i=0;i<m;i++){ p[i] = i; cin>>a[i]>>b[i]>>w[i]; } sort(p.begin(), p.end(), [&](int i, int j){ return (w[i] > w[j]); }); w[m] = -1; for(auto i : p){ int in = -1, R = w[i]; function<void(int, int, int)> dfs = [&](int u, int ed, int p){ if(u == b[i]){ in = ed; } for(auto j : edges[u]){ int x = a[j] ^ b[j] ^ u; if(x == p) continue; int tmp = ed; if(w[j] > w[ed]) tmp = j; else if(w[j] == w[ed] && j > ed) tmp = j; dfs(x, tmp, u); } }; dfs(a[i], m, a[i]); if(in == -1){ R = M; } else { R = (w[i] + w[in]) / 2; if((w[in]&1) == (w[i]&1) && in < i) R--; edges[a[in]].erase(in); edges[b[in]].erase(in); } R = max(R, w[i]); r[i] = R; tree.add(w[i], R, -w[i]); cnt.add(w[i], R, 1); edges[a[i]].insert(i); edges[b[i]].insert(i); } sort(p.begin(), p.end(), [&](int i, int j){ return (w[i] < w[j]); }); for(int i=1;i<=n;i++) edges[i].clear(); w[m] = M; for(auto i : p){ int in = -1, L = w[i]; function<void(int, int, int)> dfs = [&](int u, int ed, int p){ if(u == b[i]){ in = ed; } for(auto j : edges[u]){ int x = a[j] ^ b[j] ^ u; if(x == p) continue; int tmp = ed; if(w[j] < w[ed]) tmp = j; else if(w[j] == w[ed] && j > ed) tmp = j; dfs(x, tmp, u); } }; dfs(a[i], m, a[i]); if(in == -1){ L = 0; } else { L = (w[i] + w[in] + 1) / 2; if((w[in]&1) == (w[i]&1) && in < i) L++; edges[a[in]].erase(in); edges[b[in]].erase(in); } L = min(L, w[i]); l[i] = L; tree.add(L, w[i], w[i]); cnt.add(L, w[i], -1); edges[a[i]].insert(i); edges[b[i]].insert(i); } int q; cin>>q; while(q--){ int x; cin>>x; cout<<tree.get(x) + cnt.get(x) * x<<"\n"; } } /* 2 4 15 1 3 13 1 5 11 1 2 8 2 3 7 3 4 6 3 5 6 1 4 5 1 5 3 4 5 2 5 10 1 2 8 1 3 13 1 4 5 1 5 11 1 5 3 2 3 7 2 4 15 3 4 6 3 5 6 4 5 2 2 6 3 */
#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...