제출 #1181952

#제출 시각아이디문제언어결과실행 시간메모리
1181952sleepntsheepCultivation (JOI17_cultivation)C++20
컴파일 에러
0 ms0 KiB
//#pragma GCC optimize("O3,unroll-loops") #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{ int y[333*333],x[333*333],hd,tl; void cl(){ hd=0;tl=1; } DQ(){cl();} void ins(int t,int va){ while(hd>=tl&&x[hd]<=va)--hd; ++hd; x[hd]=va; y[hd]=t; } void tim(int t){ while(hd>=tl&&y[tl]<t)++tl; } int max(int 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<int>s,gc; int l,r,g; void ins(int 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(int 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=[&](int dw){ L.cl();R.cl();LR.cl(); int ban=0; auto Chk=[&](int i){ if(i<1)i=1; std::vector<int>e; for(int j=0;j<n;++j)if((p[j].x<=i&&p[j].x+dw>=i)) e.push_back(p[j].y); if(e.empty()){ ban=i; return; } int gapmax=0; for(int i=1;i<(int)e.size();++i) gapmax=std::max(gapmax,e[i]-e[i-1]-1); L.ins(i,e[0]-1); R.ins(i,c-e.back()); LR.ins(i,gapmax); if(ban<=i-r) ans=std::min(ans,dw+0ll+std::max(L.max(i-r+1)+R.max(i-r+1),LR.max(i-r+1))); }; std::vector<int>qwq; for(int i=0;i<n;++i){ qwq.push_back(p[i].x-1); qwq.push_back(p[i].x); qwq.push_back(p[i].x+dw+1); qwq.push_back(p[i].x+dw); } std::sort(qwq.begin(),qwq.end()); qwq.resize(std::distance(qwq.begin(),std::unique(qwq.begin(),qwq.end()))); for(auto dw:qwq)Chk(dw); }; auto CC_=[&](int dw){ L.cl();R.cl();LR.cl(); enum{ ADD,DEL,CHK }; static struct Event{ int type,x,cx; }; std::vector<Event>etag[333]; int ban{}; for(int i=0;i<n;++i){ auto&e1=etag[p[i].cx]; e1.push_back((Event){ADD,p[i].x,p[i].cx}); e1.push_back((Event){DEL,p[i].x+dw+1,p[i].cx};); e1.push_back((Event){CHK,p[i].x+dw,p[i].cx};); e1.push_back((Event){CHK,p[i].x+dw+1,p[i].cx};); e1.push_back((Event){CHK,p[i].x,p[i].cx};); e1.push_back((Event){CHK,p[i].x-1,p[i].cx};); } static int qu[999],hd,tl,l1,r1; hd=0;tl=1; for(int x1_=0;x1_<(int)xx.size();++x1_){ for(auto&ee:etag[x1_]){ int x=ee.x; if(ee.type==ADD){ qu[++hd]=ee.cx; }else if(ee.type==DEL){ ++tl; }else{ if(hd>=tl){ l1=qu[tl],r1=qu[hd]; L.ins(ee.x,plef[l1][r1]); R.ins(ee.x,prig[l1][r1]); LR.ins(ee.x,pgap[l1][r1]); }//else ban=x; if(ban<=ee.x-r) ans=std::min(ans,dw+0ll+std::max(L.max(x-r+1)+R.max(x-r+1),LR.max(x-r+1))); } } if(hd<tl)ban=x; } }; 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; }

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

cultivation.cpp: In lambda function:
cultivation.cpp:137:9: error: a storage class can only be specified for objects and functions
  137 |         static struct Event{ int type,x,cx; };
      |         ^~~~~~
cultivation.cpp:143:58: error: expected ')' before ';' token
  143 |             e1.push_back((Event){DEL,p[i].x+dw+1,p[i].cx};);
      |                         ~                                ^
      |                                                          )
cultivation.cpp:143:59: error: expected primary-expression before ')' token
  143 |             e1.push_back((Event){DEL,p[i].x+dw+1,p[i].cx};);
      |                                                           ^
cultivation.cpp:144:56: error: expected ')' before ';' token
  144 |             e1.push_back((Event){CHK,p[i].x+dw,p[i].cx};);
      |                         ~                              ^
      |                                                        )
cultivation.cpp:144:57: error: expected primary-expression before ')' token
  144 |             e1.push_back((Event){CHK,p[i].x+dw,p[i].cx};);
      |                                                         ^
cultivation.cpp:145:58: error: expected ')' before ';' token
  145 |             e1.push_back((Event){CHK,p[i].x+dw+1,p[i].cx};);
      |                         ~                                ^
      |                                                          )
cultivation.cpp:145:59: error: expected primary-expression before ')' token
  145 |             e1.push_back((Event){CHK,p[i].x+dw+1,p[i].cx};);
      |                                                           ^
cultivation.cpp:146:53: error: expected ')' before ';' token
  146 |             e1.push_back((Event){CHK,p[i].x,p[i].cx};);
      |                         ~                           ^
      |                                                     )
cultivation.cpp:146:54: error: expected primary-expression before ')' token
  146 |             e1.push_back((Event){CHK,p[i].x,p[i].cx};);
      |                                                      ^
cultivation.cpp:147:55: error: expected ')' before ';' token
  147 |             e1.push_back((Event){CHK,p[i].x-1,p[i].cx};);
      |                         ~                             ^
      |                                                       )
cultivation.cpp:147:56: error: expected primary-expression before ')' token
  147 |             e1.push_back((Event){CHK,p[i].x-1,p[i].cx};);
      |                                                        ^
cultivation.cpp:171:26: error: 'x' was not declared in this scope; did you mean 'xx'?
  171 |             if(hd<tl)ban=x;
      |                          ^
      |                          xx
cultivation.cpp: In function 'int main()':
cultivation.cpp:88:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   88 |     scanf("%d%d%d",&r,&c,&n);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
cultivation.cpp:89:30: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   89 |     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);
      |                         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~