제출 #521650

#제출 시각아이디문제언어결과실행 시간메모리
521650new_accRoad Construction (JOI21_road_construction)C++14
13 / 100
5869 ms599712 KiB
#include<bits/stdc++.h> #define fi first #define se second #define rep(a, b) for(size_t a = 0; a < (b); a++) #define pitem item* using namespace std; typedef long long ll; typedef vector<ll> vi; typedef vector<ll> vl; const int N=3e5+10; struct item{ int val,sum,il; ll prior; item *l,*r; }; vector<pair<int,int> >w; bool bb[N]; vector<ll> ans; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); unordered_map<int,int>m; deque<int> deq[N]; pair<pitem,pitem> split(pitem v,int x){ if(!v) return {nullptr,nullptr}; if((v->val)<=x){ pair<pitem,pitem> p=split(v->r,x); v->r=p.fi; v->sum=((v->l)!=nullptr?v->l->sum:0)+((v->r)!=nullptr?v->r->sum:0)+(v->il); return {v,p.se}; }else{ pair<pitem,pitem> p=split(v->l,x); v->l=p.se; v->sum=((v->l)!=nullptr?v->l->sum:0)+((v->r)!=nullptr?v->r->sum:0)+(v->il); return {p.fi,v}; } } pitem merge(pitem v1,pitem v2){ if(!v1 or !v2) return (!v1?v2:v1); if((v1->prior)>(v2->prior)){ v1->r=merge(v1->r,v2); v1->sum=((v1->l)!=nullptr?v1->l->sum:0)+((v1->r)!=nullptr?v1->r->sum:0)+(v1->il); return v1; }else{ v2->l=merge(v1,v2->l); v2->sum=((v2->l)!=nullptr?v2->l->sum:0)+((v2->r)!=nullptr?v2->r->sum:0)+(v2->il); return v2; } } pitem add(pitem v,int a){ pair<pitem,pitem> curr=split(v,a); pair<pitem,pitem> curr2=split(curr.fi,a-1); if(!curr2.se){ pitem nn=new item; nn->val=a,nn->il=1,nn->sum=1,nn->l=nullptr,nn->r=nullptr; nn->prior=uniform_int_distribution<ll>(1,1000LL*1000LL*1000LL*1000LL)(rng); v=merge(merge(curr2.fi,nn),curr.se); }else{ curr2.se->il++,curr2.se->sum++; v=merge(merge(curr2.fi,curr2.se),curr.se); } return v; } pitem del(pitem v,int a){ pair<pitem,pitem> curr=split(v,a); pair<pitem,pitem> curr2=split(curr.fi,a-1); if(curr2.se->il==1) v=merge(curr2.fi,curr.se); else{ curr2.se->il--,curr2.se->sum--; v=merge(merge(curr2.fi,curr2.se),curr.se); } return v; } void clear(pitem v){ if(!v) return; clear(v->l),clear(v->r); delete v; } bool check(ll x,ll l){; int wsk=0; pitem k=nullptr; ll res=0; rep(i,w.size()){ if(i and w[i].fi==w[i-1].fi) continue; int curr=i; while(w[wsk].fi<w[i].fi-x) k=del(k,w[wsk].se),wsk++; while(curr<(int)w.size() and w[curr].fi==w[i].fi){ pair<int,int>prz={max((ll)1e9*2LL*(-1),w[curr].se-x),min((ll)1e9*2LL,w[curr].se+x)}; pair<pitem,pitem> c=split(k,prz.se); pair<pitem,pitem> curr2=split(c.fi,prz.fi-1); res+=(!curr2.se?0:curr2.se->sum); k=merge(merge(curr2.fi,curr2.se),c.se); k=add(k,w[curr].se); curr++; } } clear(k); return res>=l; } ll bs(ll l){ ll pocz=1,kon=(ll)(1e9)*4; ll sr,res=0; while(pocz<=kon){ sr=(pocz+kon)/2; if(check(sr,l)) res=sr,kon=sr-1; else pocz=sr+1; } return res; } void odczyt(pitem k,int j){ if(!k) return; deque<int> d=deq[m[k->val]]; while(d.size()){ pair<int,int> nn={d.front(),k->val}; ans.push_back(max(abs(w[j].fi-nn.fi),abs(w[j].se-nn.se))); d.pop_front(); } odczyt(k->l,j),odczyt(k->r,j); } void solve(){ pitem k=nullptr; k=add(k,2); int n,il; cin>>n>>il; rep(i,n){ int x,y; cin>>x>>y; int x1=x-y,y1=x+y; w.push_back({x1,y1}); } sort(w.begin(),w.end(),[](pair<int,int> a,pair<int,int> b){ return a.se<b.se; }); int akt=0; rep(i,w.size()) if(!i or w[i].se!=w[i-1].se) m[w[i].se]=akt++; sort(w.begin(),w.end()); ll xd=bs(il); if(xd!=1){ ll x=xd-1,wsk=0; pitem k=nullptr; rep(i,w.size()){ if(i and w[i].fi==w[i-1].fi) continue; int curr=i; while(w[wsk].fi<w[i].fi-x) deq[m[w[wsk].se]].pop_front(),k=del(k,w[wsk].se),wsk++; while(curr<(int)w.size() and w[curr].fi==w[i].fi){ pair<int,int>prz={max((ll)1e9*2LL*(-1),w[curr].se-x),min((ll)1e9*2LL,w[curr].se+x)}; pair<pitem,pitem> c=split(k,prz.se); pair<pitem,pitem> curr2=split(c.fi,prz.fi-1); odczyt(curr2.se,curr); k=merge(merge(curr2.fi,curr2.se),c.se); k=add(k,w[curr].se); deq[m[w[curr].se]].push_back(w[curr].fi); curr++; } } } sort(ans.begin(),ans.end()); rep(i,ans.size()) cout<<ans[i]<<"\n"; for(int i=ans.size();i<il;i++) cout<<xd<<"\n"; } int main(){ ios_base::sync_with_stdio(0),cin.tie(0); solve(); }

컴파일 시 표준 에러 (stderr) 메시지

road_construction.cpp: In function 'void solve()':
road_construction.cpp:4:39: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
    4 | #define rep(a, b) for(size_t a = 0; a < (b); a++)
      |                                       ^
road_construction.cpp:123:2: note: in expansion of macro 'rep'
  123 |  rep(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...