Submission #446988

#TimeUsernameProblemLanguageResultExecution timeMemory
446988jk410Road Construction (JOI21_road_construction)C++17
100 / 100
5515 ms184944 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; struct point{ int x,y,idx; bool operator<(const point &t)const{ if (y!=t.y) return y<t.y; return x<t.x; } }; const int Tree_size=1<<18; const ll INF=4e9; int N,Cnt,Size; ll K,Ans; int Tree[Tree_size<<1],L[250001],R[250001]; point Point[250001]; vector<ll> Cor_X,Dist; deque<int> Y[250001]; void init(){ for (register int i=1; i<(Tree_size<<1); i++) Tree[i]=0; } void update(int idx,int v){ for (idx+=Tree_size; idx; idx>>=1) Tree[idx]+=v; } int query(int l,int r){ int ret=0; for (l+=Tree_size,r+=Tree_size; l<=r; l>>=1,r>>=1){ if (l&1) ret+=Tree[l++]; if (!(r&1)) ret+=Tree[r--]; } return ret; } ll f(ll m,bool flag){ ll ret=0; init(); for (int i=1,s=1; i<=N; i++){ while ((ll)Point[i].y-Point[s].y>m){ update(Point[s].idx,-1); if (flag) Y[Point[s].idx].pop_front(); s++; } int l=lower_bound(Cor_X.begin(),Cor_X.end(),Point[i].x-m)-Cor_X.begin(),r=upper_bound(Cor_X.begin(),Cor_X.end(),Point[i].x+m)-Cor_X.begin()-1; if (l<=r) ret+=query(l,r); if (flag){ for (int t=l; t<=r; t++){ for (int y:Y[t]){ Dist.push_back(max(abs((ll)Point[i].x-Cor_X[t]),(ll)Point[i].y-y)); Cnt--; } } Y[Point[i].idx].push_back(Point[i].y); } update(Point[i].idx,1); } return ret; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>N>>K; for (int i=1; i<=N; i++){ int x,y; cin>>x>>y; Point[i]={x+y,x-y}; Cor_X.push_back(Point[i].x); } sort(Point+1,Point+N+1); sort(Cor_X.begin(),Cor_X.end()); Cor_X.erase(unique(Cor_X.begin(),Cor_X.end()),Cor_X.end()); Size=Cor_X.size(); for (int i=1; i<=N; i++) Point[i].idx=lower_bound(Cor_X.begin(),Cor_X.end(),Point[i].x)-Cor_X.begin(); ll l=0,r=INF; while (l<=r){ ll m=(l+r)/2; if (f(m,false)>=K){ Ans=m; r=m-1; } else l=m+1; } Cnt=K; f(Ans-1,true); sort(Dist.begin(),Dist.end()); for (ll i:Dist) cout<<i<<"\n"; while (Cnt--) cout<<Ans<<"\n"; return 0; }

Compilation message (stderr)

road_construction.cpp: In function 'void init()':
road_construction.cpp:21:27: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
   21 |         for (register int i=1; i<(Tree_size<<1); i++)
      |                           ^
#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...