#pragma GCC optimize("O3,unroll-loops")
#include<assert.h>
#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[1955555],x[1955555];int 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<int>s,gc;
int l,r,g;
void ins(int y){
if(s.find(y)==s.end()){
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.find(y)!=s.end()){
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();
//fputs("PRECOMPDONE\n",stderr);
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();
static int qu[999],hd,tl,l1,r1;
hd=0;tl=1;
int idk=0,j1=0,j2=0,i=0;
long long x;
auto Check=[&](long long x){
while(i<n&&p[i].x<=x)
qu[++hd]=p[i++].cx;
while(idk<n&&p[idk].x+dw<x)++idk,++tl;
if(hd>=tl){
l1=tl,r1=p[i-1].cx;
L.ins(x,plef[l1][r1]);
R.ins(x,prig[l1][r1]);
LR.ins(x,pgap[l1][r1]);
}else L.ins(x,1e9),R.ins(x,1e9);
ans=std::min(ans,dw+0ll+std::max(L.max(x-r+1)+R.max(x-r+1),LR.max(x-r+1)));
};
int f1,f2;
auto X=[&](){ f1=j1<n;f2=j2<n; };
X();
while(f1&&f2){
Check(p[j1].x+dw<p[j2].x-1?p[j1++].x+dw:p[j2++].x-1);
X();
}
while(f1)Check(p[j1++].x+dw),X();
while(f2)Check(p[j2++].x-1),X();
};
std::vector<long long>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;});
for(int i=0;i<n;++i){
for(int j=i+1;j<n;++j){
ud_cands.push_back(p[j].x-0ll-p[i].x-1);
}
}
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
ud_cands.push_back(p[i].x-1+(r-p[j].x));
}
}
std::sort(ud_cands.begin(),ud_cands.end());
ud_cands.resize(std::distance(ud_cands.begin(),std::unique(ud_cands.begin(),ud_cands.end())));
int it=0;
for(auto ud:ud_cands) {
CC_(ud);
//if(++it%10000==0)
//printf("%d done \n",it);
}
printf("%lld\n",ans);
return 0;
}
컴파일 시 표준 에러 (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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |