Submission #434095

#TimeUsernameProblemLanguageResultExecution timeMemory
434095amoo_safarWorst Reporter 4 (JOI21_worst_reporter4)C++17
100 / 100
393 ms100140 KiB
// vaziat meshki-ghermeze ! #include <bits/stdc++.h> #define pb push_back #define F first #define S second #define all(x) x.begin(), x.end() #define debug(x) cerr << #x << " : " << x << '\n' using namespace std; typedef long long ll; typedef long double ld; typedef string str; typedef pair<ll, ll> pll; const ll Mod = 1000000007LL; const int N = 2e5 + 10; const ll Inf = 2242545357980376863LL; const ll Log = 30; map<int, ll> mp[N]; int a[N], h[N], c[N]; vector<int> G[N]; void DFS(int u){ for(auto adj : G[u]){ if(adj == u) continue; DFS(adj); if(mp[adj].size() > mp[u].size()) mp[u].swap(mp[adj]); for(auto [la, sm] : mp[adj]) mp[u][la] += sm; } ll del = c[u]; while(del){ auto it = mp[u].lower_bound(h[u] + 1); if(it == mp[u].end()) break; ll rm = min(del, it -> S); del -= rm; if(rm < it -> S){ mp[u][it -> F] -= rm; } else mp[u].erase(it); } mp[u][h[u]] += c[u]; // cerr << "!! " << u << " : \n"; // for(auto [x, y] : mp[u]) // cerr << x << ' ' << y << '\n'; // cerr << "------\n"; } int mk[N]; ll ans = 0; int loop[N], con[N]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; for(int i = 1; i <= n; i++){ cin >> a[i] >> h[i] >> c[i]; ans += c[i]; // G[a[i]].pb(i); h[i] = -h[i]; } for(int i = 1; i <= n; i++){ if(mk[i]) continue; int nw = i; while(!mk[nw]){ mk[nw] = i; nw = a[nw]; } if(mk[nw] < i) continue; int st = nw; vector<int> P = {st}; nw = a[nw]; while(st != nw){ P.pb(nw); nw = a[nw]; } sort(all(P), [&](int i, int j){ return h[i] < h[j]; }); for(auto x : P) loop[x] = 1; a[P[0]] = P[0]; for(int i = 1; i < (int) P.size(); i++) a[P[i]] = P[i - 1]; for(auto x : P) con[x] = P.back(); } // cerr << "!! "; for(int i = 1; i <= n; i++){ if(!loop[i] && loop[a[i]]) a[i] = con[a[i]]; // cerr << a[i] << ' '; G[a[i]].pb(i); } // cerr << '\n'; for(int i = 1; i <= n; i++) if(a[i] == i){ // debug(i); DFS(i); for(auto [x, y] : mp[i]) ans -= y; } // ll ans = 0; // for(int i = 1; i <= n; i++) ans += c[i]; // for(auto [la, sm] : mp[1]) ans -= sm; cout << ans << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...