Submission #1214765

#TimeUsernameProblemLanguageResultExecution timeMemory
1214765guagua0407Worst Reporter 4 (JOI21_worst_reporter4)C++20
100 / 100
301 ms106092 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)

worst_reporter2.cpp: In function 'void setIO(std::string)':
worst_reporter2.cpp:16:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |     freopen((s + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
worst_reporter2.cpp:17:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |     freopen((s + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...