Submission #921750

#TimeUsernameProblemLanguageResultExecution timeMemory
921750guagua0407Road Construction (JOI21_road_construction)C++17
100 / 100
8508 ms61172 KiB
//#pragma GCC optimize("O3") #include <bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int,int> #define f first #define s second #define all(x) x.begin(),x.end() #define _ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; void setIO(string s) { freopen((s + ".in").c_str(), "r", stdin); freopen((s + ".out").c_str(), "w", stdout); } const int mxn=250005; const ll inf=2e9+5; int n,k; vector<pair<int,int>> vec; vector<int> xs,ys; vector<vector<int>> sir,sir2; int bit[mxn]; void update(int pos,int val){ pos++; for(;pos<mxn;pos+=(pos&-pos)){ bit[pos]+=val; } } int query(int pos){ pos++; int ans=0; for(;pos>0;pos-=(pos&-pos)){ ans+=bit[pos]; } return ans; } bool ok(ll d){ vector<vector<pair<int,int>>> st(xs.size()); vector<vector<pair<int,pair<int,int>>>> en(xs.size()); for(int i=0;i<n;i++){ int l=lower_bound(all(xs),max(-inf,(ll)xs[vec[i].f]-d))-xs.begin(); int r=upper_bound(all(xs),min(inf,(ll)xs[vec[i].f]+d))-xs.begin()-1; int l2=lower_bound(all(ys),max(-inf,(ll)ys[vec[i].s]-d))-ys.begin(); int r2=upper_bound(all(ys),min(inf,(ll)ys[vec[i].s]+d))-ys.begin()-1; if(l>0){ st[l-1].push_back({l2,r2}); } en[vec[i].f].push_back({vec[i].s,{l2,r2}}); } memset(bit,0,sizeof(bit)); ll ans=0; for(int i=0;i<(int)xs.size();i++){ for(auto v:en[i]){ ans+=(query(v.s.s)-query(v.s.f-1)); update(v.f,1); } for(auto v:st[i]){ ans-=(query(v.s)-query(v.f-1)); } if(ans>=k) return true; } //cout<<d<<' '<<ans<<'\n'; return ans>=k; } signed main() {_ cin>>n>>k; vec.resize(n); for(int i=0;i<n;i++){ int x,y; cin>>x>>y; int xx=y+x; int yy=y-x; vec[i]={xx,yy}; xs.push_back(xx); ys.push_back(yy); } sort(all(xs)); sort(all(ys)); xs.resize(unique(all(xs))-xs.begin()); ys.resize(unique(all(ys))-ys.begin()); sir.resize(xs.size()); sir2.resize(xs.size()); for(int i=0;i<n;i++){ //cout<<vec[i].f<<' '<<vec[i].s<<'\n'; vec[i].f=lower_bound(all(xs),vec[i].f)-xs.begin(); vec[i].s=lower_bound(all(ys),vec[i].s)-ys.begin(); sir[vec[i].f].push_back(vec[i].s); sir2[vec[i].f].push_back(i); } ll l=0,r=(ll)4e9; while(l<r){ ll mid=(l+r)/2; if(ok(mid)){ r=mid; } else{ l=mid+1; } } //cout<<l<<'\n'; //return 0; ll d=l-1; vector<vector<pair<int,pair<int,int>>>> en(xs.size()); for(int i=0;i<n;i++){ int l2=lower_bound(all(ys),max(-inf,(ll)ys[vec[i].s]-d))-ys.begin(); int r2=upper_bound(all(ys),min(inf,(ll)ys[vec[i].s]+d))-ys.begin()-1; en[vec[i].f].push_back({i,{l2,r2}}); } set<pair<int,int>> S; deque<int> dq; vector<ll> ans; for(int i=0;i<(int)xs.size();i++){ //cout<<xs[i]<<'\n'; while(!dq.empty() and xs[vec[dq[0]].f]<max(-inf,(ll)xs[i]-d)){ //cout<<"xxx "<<dq[0]<<' '; S.erase({vec[dq[0]].s,dq[0]}); dq.pop_front(); } for(auto v:en[i]){ auto r=S.upper_bound({v.s.s,inf}); for(auto it=S.lower_bound({v.s.f,-inf});it!=r;it++){ int x=(*it).s; //cout<<x<<' '<<v.f<<'\n'; ans.push_back(max(abs((ll)ys[vec[x].s]-(ll)ys[vec[v.f].s]),abs((ll)xs[vec[x].f]-(ll)xs[vec[v.f].f]))); } S.insert({vec[v.f].s,v.f}); dq.push_back(v.f); } //cout<<'\n'; } sort(all(ans)); while((int)ans.size()<k){ ans.push_back(l); } for(auto v:ans){ cout<<v<<'\n'; } return 0; } //maybe its multiset not set //yeeorz //laborz

Compilation message (stderr)

road_construction.cpp: In function 'bool ok(long long int)':
road_construction.cpp:48:13: warning: unused variable 'r' [-Wunused-variable]
   48 |         int r=upper_bound(all(xs),min(inf,(ll)xs[vec[i].f]+d))-xs.begin()-1;
      |             ^
road_construction.cpp: In function 'void setIO(std::string)':
road_construction.cpp:15:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   15 |     freopen((s + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
road_construction.cpp:16:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |     freopen((s + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...