# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1214765 | guagua0407 | Worst Reporter 4 (JOI21_worst_reporter4) | C++20 | 301 ms | 106092 KiB |
//#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
#define pii pair<int,int>
#define f first
#define s second
#define all(x) x.begin(),x.end()
#define _ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void setIO(string s) {
freopen((s + ".in").c_str(), "r", stdin);
freopen((s + ".out").c_str(), "w", stdout);
}
const int mxn=2e5+5;
vector<int> adj[mxn];
map<int,int> mp[mxn];
vector<int> h(mxn),c(mxn),p(mxn);
vector<bool> is_cycle(mxn);
vector<bool> vis(mxn);
void dfs(int v){
for(auto u:adj[v]){
if(is_cycle[u]) continue;
dfs(u);
if(mp[u].size()>mp[v].size()) swap(mp[v],mp[u]);
for(auto x:mp[u]){
mp[v][x.f]+=x.s;
}
}
if(is_cycle[v]) return;
ll sum=c[v];
while(sum>0){
auto it=mp[v].lower_bound(h[v]);
if(mp[v].empty() or it==mp[v].begin()) break;
it--;
if(sum-(*it).s<0){
mp[v][(*it).f]-=sum;
break;
}
else{
sum-=(*it).s;
mp[v].erase(it);
}
}
mp[v][h[v]]+=c[v];
}
signed main(){_
int n;
cin>>n;
ll sum=0;
for(int i=1;i<=n;i++){
cin>>p[i];
cin>>h[i]>>c[i];
sum+=c[i];
adj[p[i]].push_back(i);
}
vector<vector<int>> cycle;
for(int i=1;i<=n;i++){
if(vis[i]) continue;
int x=i;
vector<int> tmp;
while(!vis[x]){
vis[x]=true;
tmp.push_back(x);
x=p[x];
}
vector<int> cyc;
bool ok=false;
for(auto v:tmp){
if(v==x) ok=true;
if(ok){
cyc.push_back(v);
}
}
if(ok) cycle.push_back(cyc);
}
for(auto vec:cycle){
for(auto v:vec){
is_cycle[v]=true;
}
vector<pair<int,ll>> dif;
for(auto v:vec){
//cout<<v<<' ';
dfs(v);
for(auto x:mp[v]){
dif.push_back(x);
}
}
//out<<'\n';
map<int,int> ord;
for(auto v:vec){
ord[h[v]]+=c[v];
}
sort(all(dif));
ll cur=0;
ll mx=0;
while(!ord.empty()){
int H=(*ord.rbegin()).f;
ll val=(*ord.rbegin()).s;
ord.erase(prev(ord.end()));
while(!dif.empty() and dif.back().f>=H){
cur+=dif.back().s;
dif.pop_back();
}
mx=max(mx,cur+val);
}
while(!dif.empty()){
cur+=dif.back().s;
dif.pop_back();
}
mx=max(mx,cur);
//cout<<mx<<'\n';
sum-=mx;
}
cout<<sum<<'\n';
return 0;
}
//maybe its multiset not set
//yeeorz
//diaoborz
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |