题面

一句话题面:给你一些点,求这些点之中夹的最大的矩形周长。(考虑边界)

Solution

首先是一个结论,答案矩形一定经过\(x=\frac{w}{2}\)或经过\(y=\frac{h}{2}\),不然答案一定不优.

怎么说?因为答案一定\(\ge 2*max(h,w)+1\),这个可以通过左右|上下显然得出.

接下来我们考虑扫描线,对于从左往右的\(p_i.x\),令\(p_i.x\)为右边界,单调栈维护上下边界然后左边界直接每一次-就行了.

唯一的问题在于弹栈时的一些小操作,代码中都有注释.

Code

/*
mail: mleautomaton@foxmail.com
author: MLEAutoMaton
This Code is made by MLEAutoMaton
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iostream>
using namespace std;
#define ll long long
#define REP(a,b,c) for(int a=b;a<=c;a++)
#define re register
#define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
#define int ll
inline int gi(){
int f=1,sum=0;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
return f*sum;
}
const int N=2000010;
int w,h,n;
struct node{
int x,y;
bool operator<(const node &b)const{return x<b.x || (x==b.x && y<b.y);}
}p[N];
typedef pair<int,int> pii;
#define mp make_pair
pii a[N],b[N];//stack
int mx[N],tag[N],ans;
void pushup(int o){mx[o]=max(mx[o<<1],mx[o<<1|1]);}
void pushdown(int o){
if(!tag[o])return;
tag[o<<1]+=tag[o];tag[o<<1|1]+=tag[o];
mx[o<<1]+=tag[o];mx[o<<1|1]+=tag[o];
tag[o]=0;
}
void modify(int o,int l,int r,int posl,int posr,int v){
if(posl<=l && r<=posr){tag[o]+=v;mx[o]+=v;return;}
pushdown(o);int mid=(l+r)>>1;
if(posl<=mid)modify(o<<1,l,mid,posl,posr,v);
if(mid<posr)modify(o<<1|1,mid+1,r,posl,posr,v);
pushup(o);
}
void work(){
memset(mx,0,sizeof(mx));memset(tag,0,sizeof(tag));
sort(p+1,p+n+1);int l=0,r=0;
for(int i=1;i<n;i++){
if(p[i].y<=h/2){
//单调栈维护
int lst=i-1;
while(l && p[i].y>a[l].second){
modify(1,1,n,a[l].first,lst,a[l].second-p[i].y);
lst=a[l--].first-1;
}
if(lst!=i-1)
a[++l]=mp(lst+1,p[i].y);
}
else{
//单调栈维护
int lst=i-1;
while(l && p[i].y<b[r].second){
modify(1,1,n,b[r].first,lst,p[i].y-b[r].second);
lst=b[r--].first-1;
}
if(lst!=i-1)b[++r]=mp(lst+1,p[i].y);
}
modify(1,1,n,i,i,h-p[i].x);//为了便于计算答案.
a[++l]=mp(i,0);b[++r]=mp(i,h);//为了减去上面或者下面.
ans=max(ans,mx[1]+p[i+1].x);//计算答案.
}
}
signed main(){
w=gi();h=gi();n=gi();
for(int i=1;i<=n;i++)p[i].x=gi(),p[i].y=gi();
p[++n]=(node){0,0};p[++n]=(node){w,h};
work();
for(int i=1;i<=n;i++)swap(p[i].x,p[i].y);swap(h,w);
work();
printf("%lld\n",ans*2);
return 0;
}

ARC063F すぬけ君の塗り絵 2 / Snuke's Coloring 2的更多相关文章

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

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

  2. [arc063]F.すぬけ君の塗り絵2

    因为这题考虑可以观察一个性质,答案的下界为 \(2×(max(w,h)+1)\), 因为你至少可以空出一行或一列,因此这个矩形一定会经过 \(x=\frac{w}{2}\) 或 \(y=\frac{h ...

  3. [Arc063F] Snuke's Coloring 2

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

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

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

  5. 【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 ...

  6. [ARC061E]すぬけ君の地下鉄旅行 / Snuke's Subway Trip

    题目大意:Snuke的城镇有地铁行驶,地铁线路图包括$N$个站点和$M$个地铁线.站点被从$1$到$N$的整数所标记,每条线路被一个公司所拥有,并且每个公司用彼此不同的整数来表示. 第$i$条线路($ ...

  7. 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 ...

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

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

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

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

随机推荐

  1. 处理vue-quill-editor回显数据的时候没有空格问题

    这是我要实现的效果 这是我回显后的情况(可以看见空格都没有了) 处理后 处理方法  添加一个class="ql-editor" <quill-editor class=&qu ...

  2. 直播知识-推流&拉流

    推流,指的是把采集阶段封包好的内容传输到服务器的过程.其实就是将现场的视频信号传到网络的过程.“推流”对网络要求比较高,如果网络不稳定,直播效果就会很差,观众观看直播时就会发生卡顿等现象,观看体验很是 ...

  3. 【HCIA Gauss】学习汇总-数据库管理(事务 权限 审计 OBDC JDBC)-6

    事务控制事务提交 commit事务回滚 rollback savepoint 用于事务设置保存点 ----> savepoint s1 / savepoint s2 rollback to sa ...

  4. Pthon魔术方法(Magic Methods)-描述器

    Pthon魔术方法(Magic Methods)-描述器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.描述器概述 1>.描述器定义 Python中,一个类实现了&quo ...

  5. ADAS 实车道路及场地测试服务

    概述         高级驾驶员辅助系统(ADAS)作为车辆主动安全的关键系统,已经被越来越多的车辆配置.ADAS系统与车辆动力.制动.转向系统有直接耦合,是车辆中可靠性要求很高的控制系统,因此针对A ...

  6. 2019年牛客多校第一场 H题XOR 线性基

    题目链接 传送门 题意 求\(n\)个数中子集内所有数异或为\(0\)的子集大小之和. 思路 对于子集大小我们不好维护,因此我们可以转换思路变成求每个数的贡献. 首先我们将所有数的线性基的基底\(b\ ...

  7. appium+python自动化64-使用Uiautomator2执行driver.keyevent()方法报错解决

    前言 未加'automationName': 'Uiautomator2'参数使用Uiautomator可以正常使用driver.keyevent()方法,使用Uiautomator2时driver. ...

  8. 学习app开发思路

    1.首先在学习之前进行一次或者是整体或者是部分的检测,当第一次检测就通过,则可以认为是熟练掌握的东西(可以在后期对其进行验证是否是熟练)2.后面的学习过程,对回答的正确与否以及从第一次开始学习到目前为 ...

  9. WPF MVVM之INotifyPropertyChanged接口的几种实现方式(转)

    原地址:https://www.cnblogs.com/xiwang/archive/2012/11/25/2787358.html 序言 借助WPF/Sliverlight强大的数据绑定功能,可以比 ...

  10. JQuery系列(4) - AJAX方法

    jQuery对象上面还定义了Ajax方法($.ajax()),用来处理Ajax操作.调用该方法后,浏览器就会向服务器发出一个HTTP请求. $.ajax方法 $.ajax()的用法主要有两种. $.a ...