제출 #1210626

#제출 시각아이디문제언어결과실행 시간메모리
1210626siewjhWorst Reporter 4 (JOI21_worst_reporter4)C++20
100 / 100
391 ms102808 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 200005; typedef long long ll; bool vis[MAXN], iscyc[MAXN]; int nxt[MAXN]; ll rate[MAXN], cost[MAXN], mxv[MAXN]; vector<int> adj[MAXN], cycle; map<ll, ll> rd[MAXN]; int dfs(int x){ vis[x] = 1; int nn = nxt[x], cst; if (vis[nn]) cst = nn; else cst = dfs(nn); if (cst != -1){ cycle.push_back(x); iscyc[x] = 1; } if (x == cst) cst = -1; return cst; } void dfs2(int x){ vis[x] = 1; mxv[x] = cost[x]; for (int nn : adj[x]){ dfs2(nn); mxv[x] += mxv[nn]; if (rd[nn].size() > rd[x].size()) swap(rd[nn], rd[x]); for (auto [p, c] : rd[nn]) rd[x][p] += c; } auto it = rd[x].lower_bound(rate[x]); ll rem = cost[x]; while (it != rd[x].begin()){ it--; if (it->second > rem){ it->second -= rem; break; } else{ rem -= it->second; it = rd[x].erase(it); } } rd[x][rate[x]] += cost[x]; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int nums; cin >> nums; for (int i = 1; i <= nums; i++){ cin >> nxt[i] >> rate[i] >> cost[i]; adj[nxt[i]].push_back(i); } ll ans = 0; for (int i = 1; i <= nums; i++){ if (vis[i]) continue; cycle.clear(); dfs(i); map<ll, ll> m; ll smxv = 0, res; for (int cn : cycle){ smxv += cost[cn]; m[rate[cn]] += cost[cn]; m[rate[cn] - 1] -= cost[cn]; for (int nn : adj[cn]){ if (iscyc[nn]) continue; dfs2(nn); smxv += mxv[nn]; if (rd[nn].size() > m.size()) swap(rd[nn], m); for (auto [p, c] : rd[nn]) m[p] += c; } } res = smxv; auto it = m.end(); while (it != m.begin()){ it--; smxv -= it->second; res = min(res, smxv); } ans += res; } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...