[atARC063F]Snuke's Coloring 2
首先,可以通过将所有$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的更多相关文章
- [Arc063F] Snuke's Coloring 2
[Arc063F] Snuke's Coloring 2 题目大意 给你一个网格图,一些点上有标记,求边长最大空白矩形. 试题分析 专门卡\(\log^2 n\)系列. 首先由题意我们可以找到答案的下 ...
- 【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 ...
- すぬけ君の塗り絵 / Snuke's Coloring AtCoder - 2068 (思维,排序,贡献)
Problem Statement We have a grid with H rows and W columns. At first, all cells were painted white. ...
- 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 ...
- AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)
题意 小 \(\mathrm{C}\) 很喜欢二维染色问题,这天他拿来了一个 \(w × h\) 的二维平面 , 初始时均为白色 . 然后他在上面设置了 \(n\) 个关键点 \((X_i , Y_i ...
- 2018.09.22 atcoder Snuke's Coloring 2(线段树+单调栈)
传送门 就是给出一个矩形,上面有一些点,让你找出一个周长最大的矩形,满足没有一个点在矩形中. 这个题很有意思. 考虑到答案一定会穿过中线. 于是我们可以把点分到中线两边. 先想想暴力如何解决. 显然就 ...
- 2018.09.19 atcoder Snuke's Coloring(思维题)
传送门 谁能想到这道题会写这么久. 本来是一道很sb的题啊. 就是每次选一个点只会影响到周围的九个方格,随便1e9进制就可以hash了,但是我非要作死用stl写. 结果由于技术不够高超,一直调不出来. ...
- [arc063F]Snuke's Coloring 2-[线段树+观察]
Description 传送门 Solution 我们先不考虑周长,只考虑长和宽. 依题意得答案下限为max(w+1,h+1),并且最后所得一定是个矩形(矩形内部无点). 好的,所以!!!答案一定会经 ...
- ARC063F すぬけ君の塗り絵 2 / Snuke's Coloring 2
题面 一句话题面:给你一些点,求这些点之中夹的最大的矩形周长.(考虑边界) Solution 首先是一个结论,答案矩形一定经过\(x=\frac{w}{2}\)或经过\(y=\frac{h}{2}\) ...
随机推荐
- 羽夏闲谈——VSCode 配置 C/C++环境
前言 VSCode是微软发布一款跨平台的源代码编辑器,其拥有强大的功能和丰富的扩展,使之能适合编写许多语言.我的环境是64位Win10,如果是其他系统请自行判断调整.本人根据网上的配置方法在结合本 ...
- 题解 [HAOI2017]方案数
题目传送门 Solution 我们没有障碍的时候很好做,直接设 \(f_{i,j,k}\) 表示到 \((x,y,z)\) \(x\) 有 \(i\) 位为 \(1\),\(y\) 有 \(j\) 位 ...
- 试题 历届试题 核桃的数量 java题解
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的要求是: ...
- Python3 网络通信 网络聊天室 文件传输
Python3 网络通信 网络聊天室 文件传输 功能描述 该项目将实现一个文字和文件传输的客户端和服务器程序通信应用程序.它将传输和接收视频文件. 文本消息必须通过TCP与服务器通信,而客户端自己用U ...
- 4.14——208. 实现 Trie (前缀树)
前缀树(字典树)是经典的数据结构,以下图所示: 本来处理每个节点的子节点集合需要用到set,但是因为输入规定了只有26个小写字母,可以直接用一个[26]的数组来存储. 关于ASCII代码: Java ...
- Java RMI学习与解读(一)
Java RMI学习与解读(一) 写在前面 本文记录在心情美丽的一个晚上. 嗯.就是心情很美丽. 那为什么晚上还要学习呢? emm... 卷... 卷起来. 全文基本都是根据su18师傅和其他师傅的文 ...
- HttpClient使用GET方式通过代理服务器读取页面的例子
import java.io.BufferedReader;import java.io.InputStreamReader;import org.apache.http.HttpEntity;imp ...
- 「总结」$dp1$
大概就是做点题. 先列一下要做的题目列表,从\(UOJ\)上找的. 129寿司晚宴 348州区划分 370滑稽树上滑稽果 457数树 22外星人 37主旋律 300吉夫特 196线段树 311积劳成疾 ...
- lib库无法加载的情况分析
最近升级vs2017的时候遇到无法加载库的问题,在网上查找问题,网上给出可能有三种情况导致该问题:路径是否正确:库依赖是否齐全:库版本是否正确.最直接的方法就是用depends软件去查询,是否有模块有 ...
- geos编译问题
gdal编译geos的时候会用到geos_c_i.lib这个文件,我用cmake编译的时候仅仅产生geos_c.lib这个文件,所以只能使用nmake的编译方式来编译geos库,nmake编译geos ...