题面

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

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. P2472 [SCOI2007]蜥蜴 (最大流)

    题目 P2472 [SCOI2007]蜥蜴 解析 这个题思路比较清晰,本(qi)来(shi)以(jiu)为(shi)无脑建图跑最大流,结果挂了,整了一个小时后重新建图才过的. 建立一个超级源点和一个超 ...

  2. Python进阶(九)----json模块, pickle模块, os模块,sys模块,hashlib模块

    Python进阶----json模块, pickle模块, os模块,sys模块,hashlib模块 一丶序列化模块 什么是序列化: ​ 将一种数据结构,转换成一个特殊的序列(特殊字符串,用于网络传输 ...

  3. 在Windows中运行Linux bash命令的几种方法

    如果你正在课程中正在学习 shell 脚本,那么需要使用 Linux 命令来练习命令和脚本. 你的学校实验室可能安装了 Linux,但是你自己没有安装了 Linux 的笔记本电脑,而是像其他人一样的 ...

  4. Flutter — IDE Shortcuts for Faster Development

    https://medium.com/flutter-community/flutter-ide-shortcuts-for-faster-development-2ef45c51085b If yo ...

  5. Spring对于事务的控制@Transactional注解详解

    引用自:https://blog.csdn.net/fanxb92/article/details/81296005 先简单介绍一下Spring事务的传播行为: 所谓事务的传播行为是指,如果在开始当前 ...

  6. 个人项目—WC

     一,Github地址:https://github.com/mushan520/WC.git 二.PSP表格: PSP2.1 Personal Software Process Stages 预估耗 ...

  7. Linux命令——mount、umount

    前言 由于引入了LVM.RAID技术,导致OS时别到的磁盘已经不单纯是事实意义上的物理磁盘(虽然OS认为他是物理盘).传统文件系统与分区可以认为是1:1关系,但是现在一个分区可以有多个FS,一个FS也 ...

  8. NODE简易综合应用服务器搭建

    node搭建简易服务器 querystring和url模板学习地址 querystring&url 1. 目录结构 2. 代码结构 const http = require('http'); ...

  9. Unity经典案例之:Fire Balls

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  10. Javascript技能

    Javascript技能 说一说我对 Javascript 这门语言的一些总结(适合前端和后端研发) 基本认识 一些心得 思维脑图的链接(icloud 分享): https://www.icloud. ...