AT2149 我的私人绘画书2 题解

Doveqise

2019-03-11 21:34:45

Solution

这道题emmm是不是叫二分??? (反正二维水一水就过去了) 分成四个块安排一下就好了 (语言&叙述可能有点糟) 详见代码 ```cpp #include<bits/stdc++.h> using namespace std; const int N=300005; int a[N],b[N],q[N],n,w,h,Y,ans; struct node{int x,y;}p[N]; bool cmp(node a,node b){return a.x<b.x;} void solve(int l,int r){ if (l==r) return; int mid=(l+r)>>1; for (int i=mid,y1=0,y2=h;i>=l;i--){ a[i]=y1;b[i]=y2; if (p[i].y>=Y) y2=min(y2,p[i].y); if (p[i].y<=Y) y1=max(y1,p[i].y); } for (int i=mid+1,y1=0,y2=h;i<=r;i++){ a[i]=y1;b[i]=y2; if (p[i].y>=Y) y2=min(y2,p[i].y); if (p[i].y<=Y) y1=max(y1,p[i].y); } for (int i=mid,j=mid+1,h=1,t=0;i>=l;i--){ for (;j<=r && a[j]<=a[i];j++){ for (;h<=t && b[q[t]]+p[q[t]].x<=b[j]+p[j].x;t--); q[++t]=j; } for (;h<t && b[i]+p[q[h]].x<=b[q[h+1]]+p[q[h+1]].x;h++); ans=max(ans,(p[q[h]].x-p[i].x+min(b[i],b[q[h]])-a[i])*2); } for (int i=mid+1,j=mid,h=1,t=0;i<=r;i++){ for (;j>=l && a[j]<=a[i];j--){ for (;h<=t && b[q[t]]-p[q[t]].x<=b[j]-p[j].x;t--); q[++t]=j; } for (;h<t && b[i]-p[q[h]].x<=b[q[h+1]]-p[q[h+1]].x;h++); ans=max(ans,(p[i].x-p[q[h]].x+min(b[i],b[q[h]])-a[i])*2); } solve(l,mid);solve(mid+1,r); } void work(){ sort(p+1,p+n+1,cmp); Y=h/2; p[0].x=0;p[n+1].x=w; p[0].y=p[n+1].y=Y; solve(0,n+1); } int main(){ scanf("%d%d%d",&w,&h,&n); for (int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y); ans=max(h,w)*2+2; work(); swap(w,h); for (int i=1;i<=n;i++) swap(p[i].x,p[i].y); work(); printf("%d\n",ans); } ```