Submission #932513

#TimeUsernameProblemLanguageResultExecution timeMemory
932513andrei_boacaWorst Reporter 4 (JOI21_worst_reporter4)C++17
100 / 100
459 ms109600 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; const ll INF=1e17; map<ll,ll> nrm; ll nr; vector<ll> muchii[400005]; vector<ll> edges[400005]; ll to[400005]; ll n,par[400005],v[400005],cost[400005]; set<pll> setik[400005]; ll ans,retard; ll aib[400005]; ll lsb(ll x) { return x&(-x); } void update(ll poz,ll val) { for(ll i=poz;i<=nr+1;i+=lsb(i)) aib[i]+=val; } ll suma(ll poz) { ll rez=0; for(ll i=poz;i>=1;i-=lsb(i)) rez+=aib[i]; return rez; } bool use[400005]; void add(ll nod,ll poz,ll val) { auto it=setik[nod].lower_bound({poz,0}); if((*it).first==poz) { ll x=(*it).second+val; setik[nod].erase(it); setik[nod].insert({poz,x}); } else setik[nod].insert({poz,val}); } void dfs(ll nod) { use[nod]=1; if(muchii[nod].empty()) { add(nod,v[nod]+1,cost[nod]); return; } ll maxim=0; ll who=0; for(int i:muchii[nod]) { dfs(i); if(setik[i].size()>maxim) { maxim=setik[i].size(); who=i; } } swap(setik[nod],setik[who]); for(int i:muchii[nod]) if(i!=who) { for(auto j:setik[i]) add(nod,j.first,j.second); setik[i].clear(); } add(nod,1,cost[nod]); ll dif=cost[nod]; while(!setik[nod].empty()&&dif>0) { auto it=prev(setik[nod].upper_bound({v[nod],INF})); ll poz=(*it).first; ll x=(*it).second; ll val=min(dif,x); x-=val; dif-=val; setik[nod].erase(it); if(x!=0) setik[nod].insert({poz,x}); } add(nod,v[nod]+1,cost[nod]); } void initdfs(int nod,int cod) { use[nod]=1; for(int i:edges[nod]) if(!use[i]) { muchii[cod].push_back(i); initdfs(i,i); } } bool byv(int a,int b) { return v[a]<v[b]; } void solve(ll start) { retard++; vector<ll> nodes; while(!use[start]) { use[start]=1; nodes.push_back(start); start=to[start]; } vector<int> ciclu; ciclu.push_back(start); while(!nodes.empty()) { if(nodes.back()==start) break; ciclu.push_back(nodes.back()); nodes.pop_back(); } for(int i:nodes) use[i]=0; for(int i:ciclu) initdfs(i,retard); dfs(retard); for(auto i:setik[retard]) update(i.first,i.second); ll s=0; sort(ciclu.begin(),ciclu.end(),byv); for(int i:ciclu) s+=cost[i]; ll minim=suma(1)+s; for(int i=0;i<ciclu.size();i++) { ll improve=0; int j=i; ll ind=v[ciclu[i]]; while(j<ciclu.size()&&v[ciclu[j]]==ind) { improve+=cost[ciclu[j]]; j++; } j--; i=j; ll val=suma(ind)+s-improve; minim=min(minim,val); } for(auto i:setik[retard]) update(i.first,-i.second); ans+=minim; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin>>n; vector<ll> vals; for(int i=1;i<=n;i++) { cin>>to[i]>>v[i]>>cost[i]; vals.push_back(v[i]); edges[i].push_back(to[i]); edges[to[i]].push_back(i); } sort(vals.begin(),vals.end()); vals.erase(unique(vals.begin(),vals.end()),vals.end()); for(int i=0;i<vals.size();i++) nrm[vals[i]]=i+1; nr=vals.size(); for(int i=1;i<=n;i++) v[i]=nrm[v[i]]; retard=n; for(int i=1;i<=n;i++) if(!use[i]) solve(i); cout<<ans; return 0; }

Compilation message (stderr)

worst_reporter2.cpp: In function 'void dfs(ll)':
worst_reporter2.cpp:58:27: warning: comparison of integer expressions of different signedness: 'std::set<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   58 |         if(setik[i].size()>maxim)
      |            ~~~~~~~~~~~~~~~^~~~~~
worst_reporter2.cpp: In function 'void solve(ll)':
worst_reporter2.cpp:133:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  133 |     for(int i=0;i<ciclu.size();i++)
      |                 ~^~~~~~~~~~~~~
worst_reporter2.cpp:138:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  138 |         while(j<ciclu.size()&&v[ciclu[j]]==ind)
      |               ~^~~~~~~~~~~~~
worst_reporter2.cpp: In function 'int main()':
worst_reporter2.cpp:167:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  167 |     for(int i=0;i<vals.size();i++)
      |                 ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...