题面

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

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. 【转载】C#使用ToList()将数组快速转换为List集合

    在C#的编程中,数组和List集合是比较常用的两个集合类,有时候因为业务需要,需要将数组集合转换为List集合,此时就可以使用C#中的Linq的扩展方法ToList方法来实现,只需要简单的一条语句即可 ...

  2. win10设置锁屏密码

    1.点击右下角窗口键 2.选择点击设置 3.点击账户 4.点击登录选项 5.点击密码,添加密码 6.设置密码 7.使用快捷键“窗口键+l”锁屏,就会提示你输入密码

  3. 《我是一只IT小小鸟》(续)读书笔记——第八周

    第三位作者强调了大学阶段规划的重要性,作者初入大学,一切都很新鲜想尝试,却缺乏对学习生活的规划.最终导致的是学习成绩的下降.其实编程也是一样,我们常常感到自己和那些大神的差距,感慨过后,往往也就罢了. ...

  4. React: webpack模块组织关系

    现代前端开发离不开打包工具,以 webpack 为代表的打包工具已经成为日常开发必备之利器,拿 React 技术栈为例,我们 ES6 形式的源代码,需要经过 webpack 和 Babel 处理,才能 ...

  5. 10 分钟上手 Vue 组件 Vue-Draggable

    Vue 综合了 Angualr 和 React 的优点,因其易上手,轻量级,受到了广泛应用.成为了是时下火热的前端框架,吸引着越来越多的前端开发者! 本文将通过一个最简单的拖拽例子带领大家快速上手 V ...

  6. SQL进阶系列之4HAVING字句的力量

    写在前面 SQL是面向集合的语言,与面向过程和面向对象语言都不一样 寻找缺失的编号 /* 寻找缺失的编号 */ CREATE TABLE SeqTbl (seq INTEGER PRIMARY KEY ...

  7. Codeforces G. Nick and Array(贪心)

    题目描述: Nick had received an awesome array of integers a=[a1,a2,…,an] as a gift for his 5 birthday fro ...

  8. 摘:J2EE开发环境搭建(1)——安装JDK、Tomcat、Eclipse

    J2EE开发环境搭建(1)——安装JDK.Tomcat.Eclipse 1:背景 进公司用SSH(Struts,spring和hibernate)开发已经有两个月了,但由于一 直要么只负责表示层的开发 ...

  9. js插件---webuploader 使用(lavarel中使用)

    js插件---webuploader 使用(lavarel中使用) 一.总结 一句话总结: 多去看几个具体使用的实例,很多blog教程都有坑,多看几个交叉印证可以没那么多坑 1.webuploader ...

  10. Docker部署nodejs应用并使用PM2作为守护进程

    环境:centos7.6 Docker version 18.06.0-ce mkdir /data cd /data 拉取最新keymetrics/pm2:latest-alpine镜像 docke ...