Submission #1181890

#TimeUsernameProblemLanguageResultExecution timeMemory
1181890sleepntsheepCultivation (JOI17_cultivation)C++20
30 / 100
2097 ms1472 KiB
#pragma GCC optimize("O3,unroll-loops")
#include<stdio.h>
#include<set>
#include<algorithm>
#include<vector>

int r,c,n;long long ans=1e10;
struct pt{int x,y;}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;

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);
    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+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,id; }ev[9999];
	int ban{},eo{};
	for(int i=0;i<n;++i){
	    ev[eo++]=(Event){ADD,p[i].x,i};
	    ev[eo++]=(Event){DEL,p[i].x+dw+1,i};
	    ev[eo++]=(Event){CHK,p[i].x+dw,i};
	    ev[eo++]=(Event){CHK,p[i].x+dw+1,i};
	    ev[eo++]=(Event){CHK,p[i].x-1,i};
	    ev[eo++]=(Event){CHK,p[i].x,i};
	}
	std::sort(ev,ev+eo,[](Event&a,Event&b){
	    if(a.x!=b.x) return a.x<b.x;
	    return a.type<b.type;
	});

	struct {
	    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();
		}
	    }
	    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();
		}
	    }
	}gm;

	for(int i1=0;i1<eo;++i1){
	    const auto&ee=ev[i1];
	    int x=ee.x;
	    if(ee.type==ADD){
		gm.ins(p[ee.id].y);
	    }else if(ee.type==DEL){
		gm.rem(p[ee.id].y);
	    }else{
		L.ins(ee.x,gm.l);
		R.ins(ee.x,gm.r);
		LR.ins(ee.x,gm.g);
		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(gm.s.empty())ban=x;
	}
    };

    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("%lld\n",ans);
    return 0;
}

Compilation message (stderr)

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