Submission #1182019

#TimeUsernameProblemLanguageResultExecution timeMemory
1182019sleepntsheepCultivation (JOI17_cultivation)C++20
80 / 100
2095 ms1728 KiB
//#pragma GCC optimize("O3,unroll-loops") #include<unordered_map> #include<stdio.h> #include<set> #include<algorithm> #include<vector> int r,c,n;long long ans=1e10; std::vector<int>xx,yy; struct pt{int x,y,cx,cy;}p[333]; struct DQ{ long long y[333*333],x[333*333],hd,tl; void cl(){ hd=0;tl=1; } DQ(){cl();} void ins(long long t,long long va){ while(hd>=tl&&x[hd]<=va)--hd; ++hd; x[hd]=va; y[hd]=t; } void tim(long long t){ while(hd>=tl&&y[tl]<t)++tl; } long long max(long long t){ tim(t); return x[tl]; } }L,R,LR; template <typename T> void sortunique(std::vector<T>&v){ std::sort(v.begin(),v.end()); v.resize(std::distance(v.begin(),std::unique(v.begin(),v.end()))); } struct GAPMAINTAINER{ std::multiset<long long>s,gc; long long l,r,g; void ins(long long y){ if(!s.count(y)){ auto it=s.upper_bound(y); if(it!=s.end()&&(it)!=s.begin()){ gc.erase(gc.find(*it-*prev(it))); } if(it!=s.end()) gc.insert(*it-y); if((it)!=s.begin())gc.insert(y-*prev(it)); s.insert(y); if(gc.size()) g=*gc.rbegin()-1; if(s.size()){ l=*s.begin()-1; r=c-*s.rbegin(); } }else s.insert(y); } void rem(long long y){ if(s.count(y)==1){ auto it=s.upper_bound(y),iy=s.lower_bound(y); if(it!=s.end())gc.erase(gc.find(*it-y)); if(iy!=s.begin())gc.erase(gc.find(y-*prev(iy))); if(it!=s.end()&&iy!=s.begin())gc.insert(*it-*prev(iy)); s.erase(s.find(y)); if(gc.size()) g=*gc.rbegin()-1; if(s.size()){ l=*s.begin()-1; r=c-*s.rbegin(); } } else s.erase(s.find(y)); } }; int pgap[333][333],plef[333][333],prig[333][333]; void precompute(){ std::vector<int>tag[333]; for(int i=0;i<n;++i) tag[p[i].cx].push_back(i); for(int i=0;i<(int)xx.size();++i){ GAPMAINTAINER gm; for(int j=i;j<(int)xx.size();++j){ for(auto id:tag[j])gm.ins(p[id].y); pgap[i][j]=gm.g; plef[i][j]=gm.l; prig[i][j]=gm.r; } } } int main(){ scanf("%d%d%d",&r,&c,&n); for(int i=0;i<n;++i)scanf("%d%d",&p[i].x,&p[i].y),xx.push_back(p[i].x),yy.push_back(p[i].y); sortunique(xx),sortunique(yy); for(int i=0;i<n;++i)p[i].cx=std::lower_bound(xx.begin(),xx.end(),p[i].x)-xx.begin(),p[i].cy=std::lower_bound(yy.begin(),yy.end(),p[i].y)-yy.begin(); precompute(); std::sort(p,p+n,[](pt&a,pt&b){return a.y-b.y?a.y<b.y:a.x<b.x;}); n=std::unique(p,p+n,[](pt&a,pt&b){return a.x==b.x&&a.y==b.y;})-p; auto CC_=[&](long long dw){ L.cl();R.cl();LR.cl(); enum{ ADD,DEL,CHK}; struct Event{ long long type,x,cx; }; std::vector<Event>e1; long long ban{}; for(int i=0;i<n;++i){ e1.push_back((Event){ADD,p[i].x,p[i].cx}); e1.push_back((Event){DEL,p[i].x+dw+1,-1}); e1.push_back((Event){CHK,p[i].x+dw,-1}); e1.push_back((Event){CHK,p[i].x+dw+1,-1}); e1.push_back((Event){CHK,p[i].x,-1}); e1.push_back((Event){CHK,p[i].x-1,-1}); } static int qu[999],hd,tl,l1,r1; hd=0;tl=1; std::sort(e1.begin(),e1.end(),[](Event&a,Event&b){if(a.x-b.x)return a.x<b.x;return a.type<b.type;}); long long x; for(auto&ee:e1){ x=ee.x; if(ee.type==ADD){ qu[++hd]=ee.cx; }else if(ee.type==DEL){ ++tl; } if(hd<tl)L.ins(x,1e9),R.ins(x,1e9); if(ee.type==CHK){ if(hd>=tl){ l1=qu[tl],r1=qu[hd]; L.ins(x,plef[l1][r1]); R.ins(x,prig[l1][r1]); LR.ins(x,pgap[l1][r1]); } ans=std::min(ans,dw+0ll+std::max(L.max(x-r+1)+R.max(x-r+1),LR.max(x-r+1))); } } }; std::vector<int>ud_cands={0}; { std::sort(p,p+n,[](pt&a,pt&b){return a.x-b.x?a.x<b.x:a.y<b.y;}); std::vector<int>uu={p[0].x-1},dd={r-p[n-1].x}; for(int i=0;i<n;++i){ uu.push_back(p[i].x-1); dd.push_back(r-p[i].x); for(int j=i;j<n;++j) if(p[j].x>p[i].x) ud_cands.push_back(p[j].x-p[i].x-1); } for(auto u:uu)for(auto d:dd)ud_cands.push_back(u+d); std::sort(ud_cands.begin(),ud_cands.end()); ud_cands.resize(std::distance(ud_cands.begin(),std::unique(ud_cands.begin(),ud_cands.end()))); } std::sort(p,p+n,[](pt&a,pt&b){return a.y-b.y?a.y<b.y:a.x<b.x;}); for(auto ud:ud_cands)CC_(ud); printf("%lld\n",ans); return 0; }

Compilation message (stderr)

cultivation.cpp: In function 'int main()':
cultivation.cpp:89:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   89 |     scanf("%d%d%d",&r,&c,&n);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
cultivation.cpp:90:30: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   90 |     for(int i=0;i<n;++i)scanf("%d%d",&p[i].x,&p[i].y),xx.push_back(p[i].x),yy.push_back(p[i].y);
      |                         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...