Submission #990661

#TimeUsernameProblemLanguageResultExecution timeMemory
990661aaaaaarrozClosing Time (IOI23_closing)C++17
100 / 100
151 ms56560 KiB
#include "closing.h" #include<bits/stdc++.h> using namespace std; const int c=200005; vector<pair<int, long long> > sz[c]; vector<pair<int, long long> > sor; long long n, dist[c][2], bal, jobb, len, pref[2*c], inf=1e18; bool ut[c]; void dfs(int a, int el, long long tav, int id) { dist[a][id]=tav; for (auto p:sz[a]) { int x=p.first; long long y=tav+p.second; if (x!=el) { dfs(x, a, y, id); } } } bool dfs2(int a, int el, long long tav) { if (a==jobb) { sor.push_back({a, tav}); ut[a]=1; return true; } for (auto p:sz[a]) { int x=p.first; long long y=tav+p.second; if (x!=el) { if (dfs2(x, a, y)) { sor.push_back({a, tav}); ut[a]=1; return true; } } } return false; } long long calc(long long ert) { if (ert<0) { return -inf; } int lo=0, hi=2*n+1, mid; while (hi-lo>1) { mid=(hi+lo)/2; if (pref[mid]<=ert) { lo=mid; } else { hi=mid; } } return lo; } int max_score(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) { n=N; for (int i=0; i<n-1; i++) { int a=U[i], b=V[i], c=W[i]; sz[a].push_back({b, c}); sz[b].push_back({a, c}); } bal=X, jobb=Y; dfs(bal, -1, 0, 0), dfs(jobb, -1, 0, 1); len=dist[jobb][0]; long long spec=0, maxi=0; if (true) { vector<long long> p; for (int i=0; i<n; i++) { p.push_back(dist[i][0]); p.push_back(dist[i][1]); } sort(p.begin(), p.end()); long long sum=0, cnt=0; for (auto x:p) { if (sum+x<=K) { sum+=x; cnt++; } } spec=cnt; } bool s=dfs2(bal, -1, 0); reverse(sor.begin(), sor.end()); long long si=sor.size(), sum=0, cnt=0, kezd=0, veg=si-1; while (kezd<=veg) { if (sor[kezd].second<=len-sor[veg].second) { cnt++; sum+=sor[kezd].second; kezd++; } else { cnt++; sum+=len-sor[veg].second; veg--; } } vector<long long> add; for (int i=kezd; i<si; i++) { add.push_back(2*sor[i].second-len); } for (int i=0; i<=veg; i++) { add.push_back(len-2*sor[i].second); } for (int i=1; i<=2*n; i++) { pref[i]=inf; } vector<pair<long long, long long> > dupla; vector<long long> prefmax, sufmin; for (int i=0; i<n; i++) { if (ut[i]) { continue; } long long a=dist[i][0], b=dist[i][1]; if (a>b) { swap(a, b); } if (2*a<=b) { add.push_back(a); add.push_back(b-a); } else { dupla.push_back({b, a}); } } sort(add.begin(), add.end()); assert(add[0]>=0); for (int i=0; i<add.size(); i++) { pref[i+1]=pref[i]+add[i]; } if (dupla.size()>0) { sort(dupla.begin(), dupla.end()); int ds=dupla.size(); prefmax.resize(ds), sufmin.resize(ds); prefmax[0]=dupla[0].first-dupla[0].second; for (int i=1; i<ds; i++) { prefmax[i]=max(prefmax[i-1], dupla[i].first-dupla[i].second); } sufmin[ds-1]=dupla[ds-1].second; for (int i=ds-2; i>=0; i--) { sufmin[i]=min(sufmin[i+1], dupla[i].second); } maxi=max(maxi, cnt+calc(K-sum)); maxi=max(maxi, cnt+1+calc(K-sum-sufmin[0])); for (int i=0; i<ds; i++) { sum+=dupla[i].first; maxi=max(maxi, cnt+2*i+1+calc(K-sum+prefmax[i])); maxi=max(maxi, cnt+2*i+2+calc(K-sum)); if (i+1<ds) { maxi=max(maxi, cnt+2*i+3+calc(K-sum-sufmin[i+1])); } } } maxi=max(maxi, cnt+calc(K-sum)); for (int i=0; i<=n; i++) { sz[i].clear(); ut[i]=0; } sor.clear(); len=0; return max(maxi, spec); }

Compilation message (stderr)

closing.cpp: In function 'int max_score(int, int, int, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:123:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  123 |     for (int i=0; i<add.size(); i++) {
      |                   ~^~~~~~~~~~~
closing.cpp:80:10: warning: unused variable 's' [-Wunused-variable]
   80 |     bool s=dfs2(bal, -1, 0);
      |          ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...