Submission #557473

#TimeUsernameProblemLanguageResultExecution timeMemory
557473600MihneaRoad Construction (JOI21_road_construction)C++17
100 / 100
3170 ms18356 KiB
#include <bits/stdc++.h> bool home = 1; using namespace std; typedef long long ll; const int N=250000+7; struct T{ ll x; ll y; int y_norm; }; bool cmpTx(T a,T b) { return a.x<b.x; } int n; int k; T a[N]; vector<ll> ys; int aib[N]; void clr() { for(int i=1;i<=n;i++) aib[i]=0; } void add(int i,int x) { while (i<=n) { aib[i]+=x; i+=i&(-i); } } int get(ll val) { int low=0,high=(int)ys.size()-1,i=0,sol=0; while (low<=high) { int mid=(low+high)/2; if(ys[mid]<=val) { i=mid+1; low=mid+1; }else{ high=mid-1; } } while(i) { sol+=aib[i]; i-=i&(-i); } return sol; } ll how_many_under(ll d) { clr(); ll sol=0; int pt=1; for (int i=1;i<=n;i++) { while (a[i].x-a[pt].x>d) add(a[pt++].y_norm,-1); sol+=get(a[i].y+d)-get(a[i].y-d-1); add(a[i].y_norm,+1); } return sol; } signed main() { #ifdef ONLINE_JUDGE home = 0; #endif home=0; if (home) { freopen("I_am_iron_man", "r", stdin); } else { ios::sync_with_stdio(0); cin.tie(0); } cin>>n>>k; for (int i=1;i<=n;i++) { int x,y; cin>>x>>y; a[i].x=x+y; a[i].y=x-y; ys.push_back(a[i].y); } sort(ys.begin(), ys.end()); ys.resize(unique(ys.begin(),ys.end())-ys.begin()); for (int i=1;i<=n;i++) { a[i].y_norm=lower_bound(ys.begin(),ys.end(),a[i].y)-ys.begin()+1; } sort(a+1,a+n+1,cmpTx); ll low=0,high=(ll)1e10,sol=-1; while (low<=high) { ll mid=(low+high)/2; if(how_many_under(mid)<=k) { sol=mid; low=mid+1; }else{ high=mid-1; } } vector<ll> v; multiset<pair<ll, int>> s; int pt=1; for (int i=1;i<=n;i++) { while (a[i].x-a[pt].x>sol) s.erase(s.find({a[pt].y, pt++})); ll low=a[i].y-sol; ll high=a[i].y+sol; auto it=s.lower_bound({low, -1}); while (it!=s.end()&&it->first<=high) { int j=it->second; v.push_back(max(a[i].x-a[j].x,abs(a[i].y-a[j].y))); it++; } s.insert({a[i].y, i}); } sort(v.begin(),v.end()); assert((int)v.size()<=k); v.resize(k, sol+1); for (auto &x: v) { cout<<x<<"\n"; } }

Compilation message (stderr)

road_construction.cpp: In function 'int main()':
road_construction.cpp:117:59: warning: operation on 'pt' may be undefined [-Wsequence-point]
  117 |     while (a[i].x-a[pt].x>sol) s.erase(s.find({a[pt].y, pt++}));
      |                                                         ~~^~
road_construction.cpp:76:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |     freopen("I_am_iron_man", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...