首先,可以通过将所有$x_{i}=0$都选择第1类,其余选第2类,构造出一个以$(0,0)$和$(1,h)$为左下角和右上角的矩形,答案即为$2h+2$,类似地还可以构造出$2w+2$

若最终的矩形不包含与$x=\frac{w}{2}$或$y=\frac{h}{2}$,那么意味着答案不超过$w+h$,而上面的构造得到了答案$2\max(w,h)+2$的下限,因此一定不优

接下来,我们分别考虑与$x=\frac{w}{2}$有交和与$y=\frac{h}{2}$有交的答案,取max即可

以$y=\frac{h}{2}$为例,暴力枚举右端点的$x$(记作$x_{i}$),即找到$j$,并最大化$x_{i}-x_{j}+\Delta y_{j+1,i-1}$(其中$\Delta y_{i,j}$指对应的最小的$y$坐标差,即$\min_{i\le k\le j,y_{k}>\frac{h}{2}}y_{k}-\max_{i\le k\le j,y_{k}\le \frac{h}{2}}y_{k}$)

(关于$\Delta y_{i,j}$中若存在$i\le k\le j$且$y_{k}=\frac{h}{2}$,看上去会有两种可能,但一定不优,任取即可)

$x_{i}$是关于$i$的常数,即要求最大化$\Delta y_{j+1,i-1}-x_{j}$,注意到每一次增加$i$也就是对$\Delta y_{j+1,i-1}$执行区间修改,修改的区间个数恰好与单调栈弹出数相同,用线段树来维护$\Delta y_{j+1,i-1}-x_{j}$最大值即可

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 #define N 300005
  4. 4 #define oo 0x3f3f3f3f
  5. 5 #define L (k<<1)
  6. 6 #define R (L+1)
  7. 7 #define mid (l+r>>1)
  8. 8 #define fi first
  9. 9 #define se second
  10. 10 stack<int>st[2];
  11. 11 pair<int,int>a[N];
  12. 12 int n,w,h,ans,f[N<<2],tag[N<<2];
  13. 13 void upd(int k,int x){
  14. 14 tag[k]+=x;
  15. 15 f[k]+=x;
  16. 16 }
  17. 17 void down(int k){
  18. 18 upd(L,tag[k]);
  19. 19 upd(R,tag[k]);
  20. 20 tag[k]=0;
  21. 21 }
  22. 22 void update(int k,int l,int r,int x,int y,int z){
  23. 23 if ((l>y)||(x>r))return;
  24. 24 if ((x<=l)&&(r<=y)){
  25. 25 upd(k,z);
  26. 26 return;
  27. 27 }
  28. 28 down(k);
  29. 29 update(L,l,mid,x,y,z);
  30. 30 update(R,mid+1,r,x,y,z);
  31. 31 f[k]=max(f[L],f[R]);
  32. 32 }
  33. 33 void calc(){
  34. 34 sort(a+1,a+n+1);
  35. 35 while (!st[0].empty())st[0].pop();
  36. 36 st[0].push(0);
  37. 37 while (!st[1].empty())st[1].pop();
  38. 38 st[1].push(0);
  39. 39 memset(tag,0,sizeof(tag));
  40. 40 memset(f,0,sizeof(f));
  41. 41 upd(1,-oo);
  42. 42 int hh=h/2;
  43. 43 for(int i=1;i<=n;i++){
  44. 44 update(1,1,n,i,i,oo+h-a[i-1].fi);
  45. 45 ans=max(ans,a[i].fi+f[1]);
  46. 46 int p=(a[i].se>hh),las=i,x=abs(a[i].se-hh)-abs(p*h-hh);
  47. 47 while (1){
  48. 48 update(1,1,n,st[p].top()+1,las,x);
  49. 49 las=st[p].top();
  50. 50 x=abs(a[i].se-hh)-abs(a[las].se-hh);
  51. 51 if ((!las)||(x>0))break;
  52. 52 st[p].pop();
  53. 53 }
  54. 54 st[p].push(i);
  55. 55 }
  56. 56 ans=max(ans,w+max(f[1],h-a[n].fi));
  57. 57 }
  58. 58 int main(){
  59. 59 scanf("%d%d%d",&w,&h,&n);
  60. 60 for(int i=1;i<=n;i++)scanf("%d%d",&a[i].fi,&a[i].se);
  61. 61 calc();
  62. 62 swap(w,h);
  63. 63 for(int i=1;i<=n;i++)swap(a[i].fi,a[i].se);
  64. 64 calc();
  65. 65 printf("%d",2*ans);
  66. 66 }

[atARC063F]Snuke's Coloring 2的更多相关文章

  1. [Arc063F] Snuke's Coloring 2

    [Arc063F] Snuke's Coloring 2 题目大意 给你一个网格图,一些点上有标记,求边长最大空白矩形. 试题分析 专门卡\(\log^2 n\)系列. 首先由题意我们可以找到答案的下 ...

  2. 【ARC 063F】Snuke's Coloring 2

    Description There is a rectangle in the xy-plane, with its lower left corner at (0,0) and its upper ...

  3. すぬけ君の塗り絵 / Snuke's Coloring AtCoder - 2068 (思维,排序,贡献)

    Problem Statement We have a grid with H rows and W columns. At first, all cells were painted white. ...

  4. Snuke's Coloring 2-1

    There is a rectangle in the xy-plane, with its lower left corner at (0,0) and its upper right corner ...

  5. AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)

    题意 小 \(\mathrm{C}\) 很喜欢二维染色问题,这天他拿来了一个 \(w × h\) 的二维平面 , 初始时均为白色 . 然后他在上面设置了 \(n\) 个关键点 \((X_i , Y_i ...

  6. 2018.09.22 atcoder Snuke's Coloring 2(线段树+单调栈)

    传送门 就是给出一个矩形,上面有一些点,让你找出一个周长最大的矩形,满足没有一个点在矩形中. 这个题很有意思. 考虑到答案一定会穿过中线. 于是我们可以把点分到中线两边. 先想想暴力如何解决. 显然就 ...

  7. 2018.09.19 atcoder Snuke's Coloring(思维题)

    传送门 谁能想到这道题会写这么久. 本来是一道很sb的题啊. 就是每次选一个点只会影响到周围的九个方格,随便1e9进制就可以hash了,但是我非要作死用stl写. 结果由于技术不够高超,一直调不出来. ...

  8. [arc063F]Snuke's Coloring 2-[线段树+观察]

    Description 传送门 Solution 我们先不考虑周长,只考虑长和宽. 依题意得答案下限为max(w+1,h+1),并且最后所得一定是个矩形(矩形内部无点). 好的,所以!!!答案一定会经 ...

  9. ARC063F すぬけ君の塗り絵 2 / Snuke's Coloring 2

    题面 一句话题面:给你一些点,求这些点之中夹的最大的矩形周长.(考虑边界) Solution 首先是一个结论,答案矩形一定经过\(x=\frac{w}{2}\)或经过\(y=\frac{h}{2}\) ...

随机推荐

  1. 洛谷3973 TJOI2015线性代数(最小割+思维)

    感觉要做出来这个题,需要一定的线代芝士 首先,我们来观察这个柿子. 我们将\(B\)的权值看作是收益的话,\(C\)的权值就是花费. 根据矩阵乘法的原理,只有当\(a[i]和a[j]\)都为\(1\) ...

  2. pycharm中设置自己的文件模板

    File>>Settings>>Editor>>File and Code Templates 选择文件类型Python Scripts,输入文件模板类型 #!/u ...

  3. 从0到1使用Kubernetes系列(三):使用Ansible安装Kubernetes集群

    前两期的文章介绍了Kubernetes基本概念和架构,用Kubeadm+Ansible搭建Kubernetes集群所需要的工具及其作用.本篇介绍怎么使用Ansible安装Kubernetes集群. 启 ...

  4. Solon 框架如何方便获取每个请求的响应时间?

    经常会有同学问 Solon 怎样才能获取每个请求的响应时间?要求是不需要给每个函数加注解.故此,整理了一下. 不给每个函数加注解,主要有两种方式可以获取请求响应时间: 方式1:基于全局过滤器 Solo ...

  5. FastAPI 学习之路(四十二)定制返回Response

    我们想要在接口中返回xml格式的内容,我们应该如何实现呢. from fastapi import FastAPI,Response @app.get("/legacy/") de ...

  6. 测试小姐姐问我 gRPC 怎么用,我直接把这篇文章甩给了她

    原文链接: 测试小姐姐问我 gRPC 怎么用,我直接把这篇文章甩给了她 上篇文章 gRPC,爆赞 直接爆了,内容主要包括:简单的 gRPC 服务,流处理模式,验证器,Token 认证和证书认证. 在多 ...

  7. Noip模拟22 2021.7.21

    T1 d 简化题意就是找到相对平均长宽的偏移量较大的矩形给他删掉 可以说是个贪心,按照a,b分别为第一关键字排序 然后假装删去要求的那么多个按a排序的较小的,然后再去b中, 找到 删去的a中的那几个矩 ...

  8. 零基础入门必备的Linux命令和C语言基础

    文件和目录(底部有视频资料) cd /home 进入 '/ home' 目录' cd - 返回上一级目录 cd -/- 返回上两级目录 cd 进入个人的主目录 cd ~user1 进入个人的主目录 c ...

  9. Photoshop cc 绿色版 最新版 下载

    Photoshop cc 绿色版 下载 Photoshop cc 绿色版 最新版下载百度网盘下载 Photoshop 下载提取码: dh6z 作为一个程序员, 不懂点基本的作图都不配"新时代 ...

  10. cf16E Fish(状压DP)

    题意: N只FISH.每个回合会有一只FISH吃掉另一个FISH.直到池塘里只剩一只FISH. 给出aij:第i只FISH吃掉第J只FISH的概率. 问每一只FISH是最后存活者的概率. Input ...