Submission #386293

#TimeUsernameProblemLanguageResultExecution timeMemory
386293model_codeWorst Reporter 4 (JOI21_worst_reporter4)C++17
100 / 100
375 ms76944 KiB
// O(N(logN)^2) #include <algorithm> #include <iostream> #include <vector> #include <queue> #include <map> using namespace std; typedef long long ll; typedef vector<int> vi; void dfs(int v,map<int,ll> &mp,vector<vi> &g,vi &H,vi &C){ for(auto u:g[v]){ map<int,ll> mp_; dfs(u,mp_,g,H,C); if(mp.size()<mp_.size()) mp.swap(mp_); for(auto p:mp_) mp[p.first]+=p.second; } mp[H[v]]+=C[v]; ll t=C[v]; while(t){ auto p=mp.upper_bound(H[v]); if(p==mp.end()) break; ll sa=min(p->second,t); p->second-=sa; t-=sa; if(p->second==0) mp.erase(p); } } ll Solve(int N,vi A,vi H,vi C){ vector<vi> g(N); ll res=0; for(int i=1;i<N;i++) g[A[i]].push_back(i); for(int i=0;i<N;i++) H[i]*=-1; for(auto i:C) res+=i; map<int,ll> mp; dfs(0,mp,g,H,C); for(auto p:mp) res-=p.second; return res; } int N; vi A,H,C; int main(){ scanf("%d",&N); A=H=C=vi(N); vi deg(N),ind(N,-1); vector<vi> g(N); queue<int> q; ll res=0; for(int i=0;i<N;i++){ scanf("%d%d%d",&A[i],&H[i],&C[i]); A[i]--; deg[A[i]]++; g[A[i]].push_back(i); } for(int i=0;i<N;i++) if(!deg[i]) q.push(i); while(!q.empty()){ int v=q.front(),u=A[v]; q.pop(); deg[u]--; if(!deg[u]) q.push(u); } for(int i=0;i<N;i++) if(ind[i]<0&&deg[i]){ int v=i,I=1; vector<pair<int,int>> b; do{ b.push_back({H[v],C[v]}); ind[v]=0; for(auto u:g[v]) if(!deg[u]){ ind[u]=I++; q.push(u); } v=A[v]; }while(v!=i); sort(b.rbegin(),b.rend()); int N_=(int)b.size(); vi A_(N_),H_,C_; for(int i=1;i<N_;i++) A_[i]=i-1; for(auto p:b){ H_.push_back(p.first); C_.push_back(p.second); } while(!q.empty()){ int u=q.front(); q.pop(); A_.push_back(ind[A[u]]+N_-1); H_.push_back(H[u]); C_.push_back(C[u]); for(auto w:g[u]){ ind[w]=I++; q.push(w); } } N_=A_.size(); res+=Solve(N_,A_,H_,C_); } printf("%lld\n",res); }

Compilation message (stderr)

worst_reporter2.cpp: In function 'int main()':
worst_reporter2.cpp:48:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   48 |  scanf("%d",&N);
      |  ~~~~~^~~~~~~~~
worst_reporter2.cpp:55:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   55 |   scanf("%d%d%d",&A[i],&H[i],&C[i]);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...