#include<stdio.h>
#include<algorithm>
#include<vector>
#include<queue>
int r,c,n,ans=1e9,fup=1e9;
struct pt{int x,y;}p[333];
struct DQ{
int y[999999],x[999999],hd,tl;
DQ(){hd=tl=0;tl=1;}
void cl(){
hd=0;tl=1;
}
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;
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),fup=std::min(fup,p[i].x-1);
std::sort(p,p+n,[](pt&a,pt&b){return a.x-b.x?a.x<b.x:a.y<b.y;});
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+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);
};
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>ud_cands={0},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("%d\n",ans);
return 0;
}
Compilation message (stderr)
cultivation.cpp: In function 'int main()':
cultivation.cpp:30:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
30 | scanf("%d%d%d",&r,&c,&n);
| ~~~~~^~~~~~~~~~~~~~~~~~~
cultivation.cpp:31:30: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
31 | for(int i=0;i<n;++i)scanf("%d%d",&p[i].x,&p[i].y),fup=std::min(fup,p[i].x-1);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |