【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 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<xi within the rectangle
- the region satisfying x>xi within the rectangle
- the region satisfying y<yi within the rectangle
- the region satisfying y>yi within 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的更多相关文章
- 【AtCoder - 2300】Snuke Line(树状数组)
BUPT2017 wintertraining(15) #9A 题意 有n个纪念品,购买区间是\([l_i,r_i]\).求每i(1-m)站停一次,可以买到多少纪念品. 题解 每隔d站停一次的列车,一 ...
- 【Windows编程】系列第五篇:GDI图形绘制
上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...
- OC学习心得【适合初学者】
一.类和对象 1.OC语言是C语言的扩充,并且OC是iOS和OS X操作系统的编程语言. ①具备完善的面向对象特性: 封装:将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内 继 ...
- 【Unity Shader】---常用帮助函数、结构体和全局变量
[Unity Shader]---常用帮助函数.结构体和全局变量 一.内置包含文件 Unity中有类似于C++的包含文件.cginc,在编写Shader时我们可以使用#include指令把这些文件包含 ...
- 【硅谷问道】Chris Lattner 访谈录(下)
[硅谷问道]Chris Lattner 访谈录(下) Chris Lattner 访谈录(下) 话题 Swift 在 Server 和操作系统方面有着怎样的雄心抱负? Swift 与 Objectiv ...
- 【硅谷问道】Chris Lattner 访谈录(上)
[硅谷问道]Chris Lattner 访谈录(上) 话题 Chris Lattner 是谁? Xcode 的编译器 LLVM 背后有怎样的故事? Swift 诞生的前世今生,封闭的苹果为何要拥抱开源 ...
- 【赛时总结】 ◇赛时·IV◇ CODE FESTIVAL 2017 Final
◇赛时-IV◇ CODE FESTIVAL 2017 Final □唠叨□ ①--浓浓的 Festival 气氛 ②看到这个比赛比较特别,我就看了一看--看到粉粉的界面突然开心,所以就做了一下 `(* ...
- UOJ#210. 【UER #6】寻找罪犯 2-sat
#210. [UER #6]寻找罪犯 链接:http://uoj.ac/problem/210 想法:2-sat模型.每个人拆点,分别表示为犯人.非犯人.每个句供词拆点,分别表示真话.假话.供词与对应 ...
- 【废弃中】JavaScript 式与运算符
创建: 2017/09/25 更新: 2019/01/14 修改标题 [JavaScript 式与运算符] -> [JavaScript 式与主要Object的方法] 更新: 2019/02/ ...
随机推荐
- SQL Server系统表sysobjects介绍
SQL Server系统表sysobjects介绍 sysobjects 表结构: 列名 数据类型 描述 name sysname 对象名,常用列 id int 对象标识号 xtype char(2) ...
- kubeadm快速搭建k8s集群
环境 master01:192.168.1.110 (最少2核CPU) node01:192.168.1.100 规划 services网络:10.96.0.0/12 pod网络:10.244.0.0 ...
- java网络爬虫基础学习(三)
尝试直接请求URL获取资源 豆瓣电影 https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort= ...
- html&css学习笔记----YJZJZQA
HTML表单: (
- android申请多个权限的正确姿势
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permi ...
- git常用命令说明教程
git常用命令说明教程 git介绍 是一个分布式的,版本控制软件.每台使用git的电脑都是一个分版本库.svn是集中管理的. 安装git 一 git相关操作 1.官网下载最新版安装https://gi ...
- vue 前端将时间戳格式化
转自西风XF : https://blog.csdn.net/qq_36242361/article/details/79143050 后端传过来的时间数据是时间戳的形式,前端需要进行格式化 1. 新 ...
- 多线程手写Future模式
future模式 在进行耗时操作的时候,线程直接阻塞,我们需要优化这样的代码,让他再启动一个线程,不阻塞.可以执行下面的代码. 这个时候我们就用到了未来者模式 future设计类 只有一个方法 pub ...
- scala的多种集合的使用(8)之队列和栈的操作方法
1.使用队列 队列是一种那个先进先出的队列.1)创建一个队列. scala> import scala.collection.mutable.Queue import scala.collect ...
- pytorch识别CIFAR10:训练ResNet-34(微调网络,准确率提升到85%)
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前一篇中的ResNet-34残差网络,经过训练准确率只达到80%. 这里对网络做点小修改,在最开始的 ...