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

    文Java中泛型的应用,让大家更好地理解泛型,以及常说的泛型类型擦除是什么概念,举一个简单的例子,如下: 这里可以看出来在代码编写阶段就已经报错了,不能往string类型的集合中添加int类型的数据. ...

  2. 【数据结构与算法Python版学习笔记】树——二叉树的应用:解析树

    解析树(语法树) 将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理 语法分析树 程序设计语言的编译 词法.语法检查 从语法树生成目标代码 自然语言处理 机器翻译 语义理 ...

  3. vue3.x自定义组件双向数据绑定v-model

    vue2.x 语法 在 2.x 中,在组件上使用 v-model 相当于绑定 value prop 并触发 input 事件: <ChildComponent v-model="pag ...

  4. 你知道什么是JUC了吗?

    多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...

  5. Github Actions 实践

    Github Actions 实践 Github Actions 是 Github 的持续集成服务,通过在 repo 发生特定的行为时执行指定的命令实现自动测试.自动部署等功能. 基本术语 workf ...

  6. 【二食堂】Beta - Scrum Meeting 3

    Scrum Meeting 3 例会时间:5.15 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 继续完成文本区域划词添加的功能 issue 1. 划词功能已经实现,继续开发 ...

  7. [no_code团队]项目介绍 & 需求分析 & 发布预测

    项目 内容 2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业要求 团队项目选择 我们在这个课程的目标是 在团队合作中提升软件开发水平 这个作业在哪个具体方面帮助我们实现目标 进行项目 ...

  8. Vue报错 type check failed for prop “xxx“. Expected String with value “xx“,got Number with value ‘xx‘

    vue报错    [Vue warn]: Invalid prop: type check failed for prop "name". Expected String with ...

  9. poi实现生成下拉选联动

    在我们实际的程序开发中,经常需要用到从excel导入数据中系统中,而为了防止用户在excel中乱输入文字,有些需要用到下拉选的地方,就需要从程序中动态生成模板.本例子简单的讲解一下,如何生成级联下拉选 ...

  10. 『学了就忘』Linux基础 — 3、CentOS镜像下载

    下载CentOS镜像可以从官网下载:https://www.centos.org/download/. 也可以从国内的镜像网站下载. 阿里云:https://mirrors.aliyun.com/ce ...