Submission #960019

#TimeUsernameProblemLanguageResultExecution timeMemory
960019CookieGrapevine (NOI22_grapevine)C++14
100 / 100
2221 ms243056 KiB
#include<bits/stdc++.h> #include<fstream> using namespace std; #define sz(a) (int)a.size() #define ALL(v) v.begin(), v.end() #define ALLR(v) v.rbegin(), v.rend() #define ll long long #define pb push_back #define forr(i, a, b) for(int i = a; i < b; i++) #define dorr(i, a, b) for(int i = a; i >= b; i--) #define ld long double #define vt vector #include<fstream> #define fi first #define se second #define pll pair<ll, ll> #define pii pair<int, int> #define mpp make_pair const ld PI = 3.14159265359, prec = 1e-9;; //using u128 = __uint128_t; //const int x[4] = {1, 0, -1, 0}; //const int y[4] = {0, -1, 0, 1}; const ll mod = 1e9 + 69, pr = 31; const int mxn = 1e5 + 5, mxq = 1e5 + 5, sq = 300, mxv = 5e4 + 1; //const int base = (1 <<18); const ll inf = 1e18 + 5, neg = -69420, inf2 = 1e16; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); // have fun! // <3; struct ST{ vt<ll>st, lz; void init(int siz, bool bad){ st.resize(4 * siz + 1, 0); lz.resize(4 * siz + 1, 0); if(bad){ for(int i = 1; i <= 4 * siz; i++)st[i] = inf; } } void push(int nd){ ll &v = lz[nd]; lz[nd << 1] += v; lz[nd << 1 | 1] += v; st[nd << 1] += v; st[nd << 1 | 1] += v; v = 0; } void change(int nd, int l, int r, int id, ll v){ if(id > r || id < l)return; if(l == r){ st[nd] = v; return; } int mid = (l + r) >> 1; push(nd); change(nd << 1, l, mid, id, v); change(nd << 1 | 1, mid + 1, r, id, v); st[nd] = min(st[nd << 1], st[nd << 1 | 1]); } void upd(int nd, int l, int r, int ql, int qr, ll v){ if(ql > r || qr < l)return; if(ql <= l && qr >= r){ st[nd] += v; lz[nd] += v; return; } push(nd); int mid = (l + r) >> 1; upd(nd << 1, l, mid, ql, qr, v); upd(nd << 1 | 1, mid + 1, r, ql, qr, v); st[nd] = min(st[nd << 1], st[nd << 1 | 1]); } ll get(int nd, int l, int r, int id){ if(id > r || id < l)return(inf); if(l == r)return(st[nd]); push(nd); int mid = (l + r) >> 1; return(min(get(nd << 1, l, mid, id), get(nd << 1 | 1, mid + 1, r, id))); } }; ST st[mxn + 1], st2[mxn + 1]; int n, q; vt<pii>adj[mxn + 1]; int tin[20][mxn + 1], tout[20][mxn + 1], tt[mxn + 1], siz[mxn + 1], dep[mxn + 1], pa[mxn + 1]; bool vis[mxn + 1], on[mxn + 1]; int dfs(int s, int pre){ siz[s] = 1; for(auto [i, w]: adj[s]){ if(i != pre && !vis[i]){ siz[s] += dfs(i, s); } } return(siz[s]); } int centroid(int s, int pre, int need){ for(auto [i, w]: adj[s]){ if(i != pre && !vis[i] && siz[i] * 2 > need)return(centroid(i, s, need)); } return(s); } void dfs2(int s, int pre, int depth,int root){ tin[depth][s] = ++tt[root]; for(auto [v, w]: adj[s]){ if(!vis[v] && v != pre){ dfs2(v, s, depth, root); } } tout[depth][s] = tt[root]; } ll eu[mxn + 1], ev[mxn + 1], ew[mxn + 1]; void build(int s, int pre, int depth){ int c = centroid(s, -1, dfs(s, -1)); dep[c] = depth; pa[c] = pre; vis[c] = 1; st[c].init(siz[s], 0); st2[c].init(siz[s], 1); dfs2(c, -1 , depth,c); for(auto [i, w]: adj[c]){ if(!vis[i]){ build(i, c, depth + 1); } } } map<pii, int>toe; void anneal(int u, int v, ll w){ if(dep[u] > dep[v])swap(u, v); int node = u; for(int i = dep[u]; i >= 0; i--){ int at = ((tin[i][u] < tin[i][v]) ? v : u); st[node].upd(1, 1, tt[node], tin[i][at], tout[i][at], w); st2[node].upd(1, 1, tt[node], tin[i][at], tout[i][at], w); //if(i == 0)cout << tin[i][v] << ' ' << tout[i][v] << " " << w << "\n"; node = pa[node]; } } void seek(int u){ ll ans = inf; int node = u; for(int i = dep[u]; i >= 0; i--){ //cout << node << " " << st2[node].st[1] << "\n"; ans = min(ans, st[node].get(1, 1, tt[node], tin[i][u]) + st2[node].st[1]); node = pa[node]; } cout << ((ans >= inf2) ? -1 : ans) << "\n"; } void soak(int u){ int node = u; for(int i = dep[u]; i >= 0; i--){ if(on[u])st2[node].change(1, 1, tt[node], tin[i][u], st[node].get(1, 1, tt[node], tin[i][u])); else st2[node].change(1, 1, tt[node], tin[i][u], inf); node = pa[node]; } } void solve(){ cin >> n >> q; for(int i = 1; i < n; i++){ cin >> eu[i] >> ev[i] >> ew[i]; if(eu[i] > ev[i])swap(eu[i], ev[i]); toe[mpp(eu[i], ev[i])] = i; adj[eu[i]].pb(mpp(ev[i], ew[i])); adj[ev[i]].pb(mpp(eu[i], ew[i])); } build(1, -1, 0); for(int i = 1; i < n; i++){ anneal(eu[i], ev[i], ew[i]); } while(q--){ int idq; cin >> idq; if(idq == 1){ int u; cin >> u; seek(u); }else if(idq == 2){ int u; cin >> u; on[u] = !on[u]; soak(u); }else{ int a, b, w; cin >> a >> b >> w; if(a > b)swap(a, b); ll crw = ew[toe[mpp(a, b)]]; anneal(a, b, w - crw); ew[toe[mpp(a, b)]] = w; } } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); //freopen("netw.inp", "r", stdin); //freopen("netw.out", "w", stdout); int ttt; ttt = 1; while(ttt--){ solve(); } return(0); } /* 1 5 7 2 1 1 1 3 1 2 2 2 3 4 2 4 2 4 2 1 5 5 3 5 2 5 3 2 7 3 3 1 1 1 1 1 2 2 1 3 3 3 1 */

Compilation message (stderr)

Main.cpp: In function 'int dfs(int, int)':
Main.cpp:81:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   81 |     for(auto [i, w]: adj[s]){
      |              ^
Main.cpp: In function 'int centroid(int, int, int)':
Main.cpp:89:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   89 |     for(auto [i, w]: adj[s]){
      |              ^
Main.cpp: In function 'void dfs2(int, int, int, int)':
Main.cpp:96:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   96 |     for(auto [v, w]: adj[s]){
      |              ^
Main.cpp: In function 'void build(int, int, int)':
Main.cpp:110:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  110 |     for(auto [i, w]: adj[c]){
      |              ^
Main.cpp: In function 'void solve()':
Main.cpp:151:9: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
  151 |         if(eu[i] > ev[i])swap(eu[i], ev[i]); toe[mpp(eu[i], ev[i])] = i;
      |         ^~
Main.cpp:151:46: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  151 |         if(eu[i] > ev[i])swap(eu[i], ev[i]); toe[mpp(eu[i], ev[i])] = i;
      |                                              ^~~
#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...