Submission #725864

#TimeUsernameProblemLanguageResultExecution timeMemory
725864MohammadAghilWorst Reporter 4 (JOI21_worst_reporter4)C++17
79 / 100
649 ms49084 KiB
#include <bits/stdc++.h> using namespace std; #define rep(i,l,r) for(int i = (l); i < (r); i++) #define per(i,r,l) for(int i = (r); i >= (l); i--) #define all(x) begin(x), end(x) #define sz(x) (int)size(x) #define pb push_back #define ff first #define ss second typedef long long ll; typedef pair<int, int> pp; void dbg(){ cerr << endl; } template<typename H, typename... T> void dbg(H h, T... t){ cerr << h << ", "; dbg(t...); } void IOS(){ cin.tie(0) -> sync_with_stdio(0); #ifndef ONLINE_JUDGE // freopen("inp.txt", "r", stdin); // freopen("out.txt", "w", stdout); #define er(...) cerr << __LINE__ << " <" << #__VA_ARGS__ << ">: ", dbg(__VA_ARGS__) #else #define er(...) 0 #endif } mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const ll mod = 1e9 + 7, mod2 = 1e9 + 9, maxn = 2e5 + 5, lg = 21, inf = ll(1e9) + 5; ll pw(ll a, ll b){ if(b == 0) return 1; ll k = pw(a, b>>1); return k*k*(b&1ll?a:1); } vector<int> adj[maxn]; ll par[maxn], H[maxn], C[maxn], nxt[maxn]; int h[maxn], cnt[maxn], top[maxn], st[maxn], en[maxn], t, eu[maxn]; ll dp[maxn]; bool vis[maxn], vis2[maxn]; vector<int> srt; int root[maxn]; void dfs2(int r){ srt.pb(r); vis2[r] = true; for(int c: adj[r]) if(!vis2[c]) dfs2(c); } int seg[maxn<<2]; int get(int l, int r, int x = 1, int lx = 0, int rx = t){ if(l <= lx && r >= rx) return seg[x]; int mid = (lx + rx)>>1; int res = -1; if(mid < r) res = get(l, r, x<<1|1, mid, rx); if(res + 1) return res; if(l < mid) return get(l, r, x<<1, lx, mid); return -1; } void upd(int i, bool act, int x = 1, int lx = 0, int rx = t){ if(lx + 1 == rx){ seg[x] = act? i: -1; return; } int mid = (lx + rx)>>1; if(i < mid) upd(i, act, x<<1, lx, mid); else upd(i, act, x<<1|1, mid, rx); seg[x] = max(seg[x<<1], seg[x<<1|1]); } ll fen[maxn]; ll getf(int i){ ll res = 0; for(i++; i; i -= i&-i) res += fen[i]; return res; } ll getf(int l, int r){ return getf(r-1) - getf(l-1); } ll getu(int u){ return getf(st[u], en[u]); } void updf(int i, ll k){ for(i++; i < maxn; i += i&-i) fen[i] += k; } void dfs(int r, int p, int rt){ root[r] = rt; par[r] = p; cnt[r] = 1; for(int c: adj[r]) if(!vis[c] && c - p){ h[c] = h[r] + 1; dfs(c, r, rt); cnt[r] += cnt[c]; } } void dfsHLD(int r, int p, int tp){ eu[t] = r; top[r] = tp, st[r] = t++; pp bst = {-1, -1}; for(int c: adj[r]) if(!vis[c] && c - p) bst = max(bst, {cnt[c], c}); if(bst.ff + 1){ dfsHLD(bst.ss, r, tp); for(int c: adj[r]) if(c - bst.ss && !vis[c] && c - p) dfsHLD(c, r, c); } en[r] = t; } void add(int u){ dp[u] = getu(u) + C[u]; ll sm = C[u], cr = u; upd(st[u], true); u = par[u]; if(u + 1){ updf(st[u], sm); } while(u + 1){ int x = get(st[top[u]], st[u] + 1); if(x + 1){ x = eu[x]; if(par[x] + 1) updf(st[par[x]], -sm); ll t = getu(x); if(t > dp[x]){ sm = t - dp[x]; upd(st[x], false); u = par[x]; if(u + 1) updf(st[u], sm); } else break; } else u = par[top[u]]; } } int main(){ IOS(); int n; cin >> n; ll sum = 0; rep(i,0,n){ cin >> nxt[i] >> H[i] >> C[i]; nxt[i]--; sum += C[i]; adj[i].pb(nxt[i]), adj[nxt[i]].pb(i); } fill(seg, seg + (maxn<<2), -1); rep(i,0,n){ if(!vis2[i]){ dfs2(i); int a = i, b = i; do{ a = nxt[a], b = nxt[nxt[b]]; } while(a - b); map<int, vector<int>> is; do{ vis[a] = true; a = nxt[a]; } while(a - b); do{ dfs(a, -1, a); dfsHLD(a, -1, a); is[H[a]].pb(a); a = nxt[a]; } while(a - b); ll sm = 0; ll res = 0; sort(all(srt), [&](int i, int j){ return pp(H[i], h[i]) > pp(H[j], h[j]); }); rep(i,0,sz(srt)){ int u = srt[i]; ll g = getu(root[u]); sm -= g; add(u); ll v = getu(root[u]); assert(g <= v); sm += v; if(i == sz(srt)-1 || H[u] - H[srt[i+1]]){ if(is.count(H[u])){ ll t = sm; for(int c: is[H[u]]){ t += C[c]; } res = max(res, t); } } } sum -= max(res, sm); srt.clear(); } } cout << sum << '\n'; return 0; }

Compilation message (stderr)

worst_reporter2.cpp: In function 'void add(int)':
worst_reporter2.cpp:120:20: warning: unused variable 'cr' [-Wunused-variable]
  120 |      ll sm = C[u], cr = u;
      |                    ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...