Description

There is a rectangle in the xy-plane, with its lower left corner at (0,0) and its upper right corner at (W,H). Each of its sides is parallel to the x-axis or y-axis. Initially, the whole region within the rectangle is painted white.

Snuke plotted N points into the rectangle. The coordinate of the i-th (1≤i≤N) point was (xi,yi).

Then, for each 1≤i≤N, he will paint one of the following four regions black:

  • the region satisfying x<xwithin the rectangle
  • the region satisfying x>xi within the rectangle
  • the region satisfying y<yi within the rectangle
  • the region satisfying y>ywithin the rectangle

Find the longest possible perimeter of the white region of a rectangular shape within the rectangle after he finishes painting.

题意:给定一个$W\times H$的二维平面,初始均为白色,有$n$个关键点$(x_{i},y_{i})$,对于每一个关键点选择一个方向,并将该方向上的所有网格涂成黑色。易得操作后白色部分一定是一个矩形,请最大化矩形周长。

分析:

观察可以得到一个性质,答案矩形一定会经过直线$x=\frac{W}{2}$或$y=\frac{H}{2}$。两种情况可以用相同的方式处理出答案。

将坐标离散化后,枚举矩形的上下边界,可以直接计算出矩形的左右边界。考虑用线段树进行优化。左右各开一个单调栈,在维护单调栈时在线段树上进行区间加减即可。(其实画图比较方便理解。

 #include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
#define lc(x) x<<1
#define rc(x) x<<1|1
using namespace std;
const int N=3e5+;
int w,h,n,ans,L,R;
int mx[N*],tag[N*];
struct node{int x,y;node(int _x=,int _y=):x(_x),y(_y){};}p[N],a[N],b[N];
int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
void modify(int x,int l,int r,int v)
{
if(L<=l&&r<=R){mx[x]+=v;tag[x]+=v;return;}
int mid=(l+r)>>;
if(L<=mid)modify(lc(x),l,mid,v);
if(R>mid)modify(rc(x),mid+,r,v);
mx[x]=max(mx[lc(x)],mx[rc(x)])+tag[x];
}
bool cmp(node a,node b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
void work()
{
memset(mx,,sizeof(mx));
memset(tag,,sizeof(tag));
sort(p+,p+n+,cmp);
int l=,r=;
for(int i=;i<=n-;i++)
{
if(p[i].y<=h/)
{
int nxt=i-;
while(l&&a[l].y<p[i].y)
{
L=a[l].x;R=nxt;nxt=a[l].x-;
modify(,,n,a[l].y-p[i].y);l--;
}
if(nxt!=i-)a[++l]=node(nxt+,p[i].y);
}
else
{
int nxt=i-;
while(r&&b[r].y>p[i].y)
{
L=b[r].x;R=nxt;nxt=b[r].x-;
modify(,,n,p[i].y-b[r].y);r--;
}
if(nxt!=i-)b[++r]=node(nxt+,p[i].y);
}
a[++l]=node(i,);b[++r]=node(i,h);
L=i;R=i;modify(,,n,h-p[i].x);
ans=max(ans,mx[]+p[i+].x);
}
}
int main()
{
w=read();h=read();n=read();
for(int i=;i<=n;i++)p[i].x=read(),p[i].y=read();
p[++n]=node(,);p[++n]=node(w,h);work();
for(int i=;i<=n;i++)swap(p[i].x,p[i].y);
swap(w,h);work();
printf("%d",ans*);
return ;
}

【ARC 063F】Snuke's Coloring 2的更多相关文章

  1. 【AtCoder - 2300】Snuke Line(树状数组)

    BUPT2017 wintertraining(15) #9A 题意 有n个纪念品,购买区间是\([l_i,r_i]\).求每i(1-m)站停一次,可以买到多少纪念品. 题解 每隔d站停一次的列车,一 ...

  2. 【Windows编程】系列第五篇:GDI图形绘制

    上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...

  3. OC学习心得【适合初学者】

    一.类和对象 1.OC语言是C语言的扩充,并且OC是iOS和OS X操作系统的编程语言. ①具备完善的面向对象特性: 封装:将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内 继 ...

  4. 【Unity Shader】---常用帮助函数、结构体和全局变量

    [Unity Shader]---常用帮助函数.结构体和全局变量 一.内置包含文件 Unity中有类似于C++的包含文件.cginc,在编写Shader时我们可以使用#include指令把这些文件包含 ...

  5. 【硅谷问道】Chris Lattner 访谈录(下)

    [硅谷问道]Chris Lattner 访谈录(下) Chris Lattner 访谈录(下) 话题 Swift 在 Server 和操作系统方面有着怎样的雄心抱负? Swift 与 Objectiv ...

  6. 【硅谷问道】Chris Lattner 访谈录(上)

    [硅谷问道]Chris Lattner 访谈录(上) 话题 Chris Lattner 是谁? Xcode 的编译器 LLVM 背后有怎样的故事? Swift 诞生的前世今生,封闭的苹果为何要拥抱开源 ...

  7. 【赛时总结】 ◇赛时·IV◇ CODE FESTIVAL 2017 Final

    ◇赛时-IV◇ CODE FESTIVAL 2017 Final □唠叨□ ①--浓浓的 Festival 气氛 ②看到这个比赛比较特别,我就看了一看--看到粉粉的界面突然开心,所以就做了一下 `(* ...

  8. UOJ#210. 【UER #6】寻找罪犯 2-sat

    #210. [UER #6]寻找罪犯 链接:http://uoj.ac/problem/210 想法:2-sat模型.每个人拆点,分别表示为犯人.非犯人.每个句供词拆点,分别表示真话.假话.供词与对应 ...

  9. 【废弃中】JavaScript 式与运算符

    创建: 2017/09/25 更新: 2019/01/14 修改标题 [JavaScript 式与运算符] ->  [JavaScript 式与主要Object的方法] 更新: 2019/02/ ...

随机推荐

  1. asp.net webapi 的Request如何获取参数

    public class BaseApiController : ApiController { private HttpRequestBase _request; /// 全局Requests对象 ...

  2. Neuroph开发过程

    文章提纲 安装与配置 开发小结 建立项目 配置项目 理解感知机的代码 安装与配置 JDK的安装:建议JRE 1.8以上: Neuroph安装:建议2.94的版本.下载地址 neuroph-core-2 ...

  3. Linux根据端口号查看进程PID

    1.命令lsof,以查找占用端口80为例,用法如下: [root@localhost nginx]# lsof -i:80 以上为没有进程占用80端口, [root@localhost sbin]# ...

  4. DAO层设计Junit测试

    DAO层的设计: 在实际的开发中有一种项目的程序组织架构方案叫做MVC模式. MVC模式就是按照程序的功能将它们分成三层,分别是Modle层 (模型层).View(显示层).Controller(控制 ...

  5. vmware workstation安装教程以及其中出现的错误解决方法

    VMware Workstation 安装教程   1 下载好虚拟机,然后运行,点击下一步 2 选择我接受,下一步 3 选择安装的位置,可以自己选择,也可以默认不更改,这个无影响(图中I:\下面的VM ...

  6. Xcode: Run Script 的运用, 使build打包后自动+1

    背景: 每次打包都要build+1处理,比较麻烦,使用 Run Script 的运用使build打包后自动+1 0. 使用xcode 添加run Script 然后就可以添加Run Script了 1 ...

  7. gradle配置国内镜像

    对单个项目生效,在项目中的build.gradle修改内容 buildscript { repositories { maven { url 'http://maven.aliyun.com/nexu ...

  8. MediaManager安装后配置

    端口要改成81 修改Chainmail名称:

  9. SpringMVC实现文件下载时,请求路径中的扩展名被省略

    问题描述 问题是这样的,我写了一个DownloadController,用来处理下载请求,预期效果如下: 客户端浏览器在访问URL -->   http://localhost:8080/ssm ...

  10. Markdown语法基础

    Markdown基本语法 创建 2018-09-07 by YANHAI 标题:Setext方式 三个或更多 大标题 === 小标题 --- 大标题 小标题 标题:Atx方式 # 内容 (一级标题) ...