Submission #386710

#TimeUsernameProblemLanguageResultExecution timeMemory
386710ogibogi2004Road Construction (JOI21_road_construction)C++14
0 / 100
10091 ms57564 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long const int MAXN=250006; const ll INF=4e9; int n,k; vector<ll>output; struct point { ll x,y; bool operator<(point const& other)const { return make_pair(x,y)<make_pair(other.x,other.y); } }; struct BIT { int t[MAXN]; void init() { for(int i=0;i<MAXN;++i)t[i]=0; } void update(int idx,int val) { ++idx; for(;idx<MAXN;idx+=idx&(-idx)) { t[idx]+=val; } } int query(int idx) { ++idx; int ret=0; for(;idx>0;idx-=idx&(-idx)) { ret+=t[idx]; } return ret; } int query(int l,int r) { return query(r)-query(l-1); } }fen; vector<point>v; map<int,int>compressed_y; map<int,int>compressed_x; set<int>xs; set<int>ys; bool ok(ll d) { fen.init(); int last_deleted=-1; int cnt=0; for(int i=0;i<v.size();++i) { while(v[last_deleted+1].x+d<v[i].x) { ++last_deleted; fen.update(compressed_y[v[last_deleted].y],-1); } auto l=ys.lower_bound(v[i].y-d); auto r=ys.lower_bound(v[i].y+d+1); --r; cnt+=fen.query(compressed_y[(*l)],compressed_y[(*r)]); if(cnt>=k)break; fen.update(compressed_y[v[i].y],1); } //cout<<d<<" "<<cnt<<endl; return cnt>=k; } void find(ll d) { fen.init(); int last_deleted=-1; set<pair<ll,ll> >s; for(int i=0;i<v.size();++i) { //cout<<i<<":\n"; while(v[last_deleted+1].x+d<v[i].x) { ++last_deleted; s.erase({v[last_deleted].y,v[last_deleted].x}); } auto it=s.lower_bound({v[i].y-d,-INF}); for(;it!=s.end();++it) { if((*it).first>v[i].y+d)break; //cout<<(*it).first<<" "<<(*it).second<<" "<<v[i].x<<" "<<v[i].y<<endl; output.push_back(max(abs((*it).first-v[i].y),abs((*it).second-v[i].x))); } s.insert({v[i].y,v[i].x}); } sort(output.begin(),output.end()); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL); cin>>n>>k; for(int i=1;i<=n;++i) { int x,y; cin>>x>>y; v.push_back({x+y,x-y}); xs.insert(v.back().x); ys.insert(v.back().y); } xs.insert(-INF); xs.insert(INF); ys.insert(-INF); ys.insert(INF); int cnt=0; for(auto xd:xs) { ++cnt; compressed_x[xd]=cnt; } cnt=0; for(auto xd:ys) { ++cnt; compressed_y[xd]=cnt; } sort(v.begin(),v.end()); /*cout<<"v:\n"; for(auto xd:v) { cout<<xd.x<<" "<<xd.y<<endl; } cout<<endl<<endl;*/ ll low=0,high=INF,mid,ans=-1; while(low<=high) { mid=(low+high)/2; if(ok(mid)) { ans=mid; high=mid-1; } else low=mid+1; } //cout<<ans<<endl; find(ans); //cout<<output.size()<<endl; for(int i=0;i<output.size()&&i<k;++i)cout<<output[i]<<'\n'; //cout<<(ll)k-(ll)output.size()<<endl; for(int i=0;i<(ll)k-(ll)output.size();++i)cout<<ans<<'\n'; return 0; }

Compilation message (stderr)

road_construction.cpp: In function 'bool ok(long long int)':
road_construction.cpp:56:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<point>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |  for(int i=0;i<v.size();++i)
      |              ~^~~~~~~~~
road_construction.cpp: In function 'void find(long long int)':
road_construction.cpp:78:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<point>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |  for(int i=0;i<v.size();++i)
      |              ~^~~~~~~~~
road_construction.cpp: In function 'int main()':
road_construction.cpp:110:12: warning: overflow in conversion from 'long long int' to 'std::set<int>::value_type' {aka 'int'} changes value from '-4000000000' to '294967296' [-Woverflow]
  110 |  xs.insert(-INF);
      |            ^~~~
road_construction.cpp:112:12: warning: overflow in conversion from 'long long int' to 'std::set<int>::value_type' {aka 'int'} changes value from '-4000000000' to '294967296' [-Woverflow]
  112 |  ys.insert(-INF);
      |            ^~~~
road_construction.cpp:147:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  147 |  for(int i=0;i<output.size()&&i<k;++i)cout<<output[i]<<'\n';
      |              ~^~~~~~~~~~~~~~
#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...