[arc063F]Snuke's Coloring 2-[线段树+观察]
Description
Solution
我们先不考虑周长,只考虑长和宽。
依题意得答案下限为max(w+1,h+1),并且最后所得一定是个矩形(矩形内部无点)。
好的,所以!!!答案一定会经过$y=\frac{h}{2}$或$x=\frac{w}{2}$。否则答案就。。显然不满足下限了啊。
我们先考虑答案经过$y=\frac{h}{2}$的情况。另一种情况同理(或者把图翻过来也可以)
我们维护两个单调栈和一个线段树。一个栈a维护直线下方的递减y序列和序列内点的编号,另一个栈b维护直线上方的递增y序列和序列内点的编号,线段树的叶子节点(代表点j)为由当前节点i到j+1所能取到的竖直方向最大值减去x[j](也可理解为矩阵的一条边在j处)。这样ans就为max(ans,x[i+1]+maxn[1])。这里的maxn[1]是指线段树根节点。线段树维护最大值。
单调栈和线段树的更新:对于新添进来的节点i,如果a[top].y<y[i],则线段树区间[a[top].id,i-1]这一段区间减去y[i]-a[top].y;对于b的更新同理。最后添加(id=i,y=0)到a栈,(id=i,y=h)到b栈,(h-x[i])到线段树代表区间为[i,i]的节点。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define x first
#define y second
using namespace std;
int w,h,n;
struct P{int x,y;
friend bool operator<(P a,P b) {return a.x==b.x?a.y<b.y:a.x<b.x;}}p[]; int mx[],tag[];
int tp1,tp2,nxt;
pair<int,int> l[],r[];
void downtag(int k){mx[k<<]+=tag[k];mx[k<<|]+=tag[k];
tag[k<<]+=tag[k];tag[k<<|]+=tag[k];tag[k]=;}
void modify(int k,int l,int r,int askx,int asky,int x)
{
if (askx<=l&&r<=asky) {tag[k]+=x;mx[k]+=x;return;}
int mid=(l+r)/;
if (tag[k]) downtag(k);
if (askx<=mid) modify(k<<,l,mid,askx,asky,x);
if (asky>mid) modify(k<<|,mid+,r,askx,asky,x);
mx[k]=max(mx[k<<],mx[k<<|]);
}
int ans=;
void solve()
{
memset(mx,,sizeof(mx));
memset(tag,,sizeof(tag));
sort(p+,p+n+);
tp1=tp2=;
for (int i=;i<=n;i++)
{
if (p[i].y<=h/)
{
nxt=i-;
while (tp1&&p[i].y>l[tp1].y)
{
modify(,,n,l[tp1].x,nxt,l[tp1].y-p[i].y);
nxt=l[tp1].x-;tp1--;
}
if (nxt!=i-) l[++tp1]=make_pair(nxt+,p[i].y);
}
else
{
nxt=i-;
while (tp2&&p[i].y<r[tp2].y)
{
modify(,,n,r[tp2].x,nxt,p[i].y-r[tp2].y);
nxt=r[tp2].x-;tp2--;
}
if (nxt!=i-) r[++tp2]=make_pair(nxt+,p[i].y);
}
l[++tp1]=make_pair(i,);
r[++tp2]=make_pair(i,h);
modify(,,n,i,i,h-p[i].x);
ans=max(ans,p[i+].x+mx[]);
}
}
int main()
{
scanf("%d%d%d",&w,&h,&n);
for (int i=;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y);
p[++n]=P{,};p[++n]=P{w,h};
solve();
for (int i=;i<=n;i++) swap(p[i].x,p[i].y);swap(w,h);
solve();
printf("%d",ans<<);
}
[arc063F]Snuke's Coloring 2-[线段树+观察]的更多相关文章
- AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)
		题意 小 \(\mathrm{C}\) 很喜欢二维染色问题,这天他拿来了一个 \(w × h\) 的二维平面 , 初始时均为白色 . 然后他在上面设置了 \(n\) 个关键点 \((X_i , Y_i ... 
- [Arc063F] Snuke's Coloring 2
		[Arc063F] Snuke's Coloring 2 题目大意 给你一个网格图,一些点上有标记,求边长最大空白矩形. 试题分析 专门卡\(\log^2 n\)系列. 首先由题意我们可以找到答案的下 ... 
- 【arc073e】Ball Coloring(线段树,贪心)
		[arc073e]Ball Coloring(线段树,贪心) 题面 AtCoder 洛谷 题解 大型翻车现场,菊队完美压中男神的模拟题 首先钦定全局最小值为红色,剩下的袋子按照其中较大值排序. 枚举前 ... 
- HDU 4027 Can you answer these queries(线段树 + 观察 )
		这题主要考察观察能力. 2^63最多只需要开7次根号就会变成1,当数字变成1之后就不需要再对其进行操作. 对于含有大于1数字的区间,向下更新. 对于数字全为1的区间,直接返回. #include &l ... 
- 洛谷P3960 列队(动态开节点线段树)
		题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ... 
- 2018.09.22 atcoder Snuke's Coloring 2(线段树+单调栈)
		传送门 就是给出一个矩形,上面有一些点,让你找出一个周长最大的矩形,满足没有一个点在矩形中. 这个题很有意思. 考虑到答案一定会穿过中线. 于是我们可以把点分到中线两边. 先想想暴力如何解决. 显然就 ... 
- 【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 ... 
- 【Codeforces717F】Heroes of Making Magic III      线段树 + 找规律
		F. Heroes of Making Magic III time limit per test:3 seconds memory limit per test:256 megabytes inpu ... 
- [USACO2005][POJ3171]Cleaning Shifts(DP+线段树优化)
		题目:http://poj.org/problem?id=3171 题意:给你n个区间[a,b],每个区间都有一个费用c,要你用最小的费用覆盖区间[M,E] 分析:经典的区间覆盖问题,百度可以搜到这个 ... 
随机推荐
- IOS .a静态库的和.framework制作
			什么是库? 库是程序代码的集合,是共享程序代码的一种方式 根据源代码的公开情况,库可以分为2种类型 开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworking 闭源库 不公 ... 
- 【RabbitMQ】2、RabbitMQ入门程序——Hello World
			首先说一下,MQ全称为Message Queue消息队列是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的是程序 ... 
- Java虚拟机13:Java类加载机制
			前言 我们知道我们写的程序经过编译后成为了.class文件,.class文件中描述了类的各种信息,最终都需要加载到虚拟机之后才能运行和使用.而虚拟机如何加载这些.class文件?.class文件的信息 ... 
- 没有什么问题是sudo rm -rf /* 解决不了的
			没有什么问题是sudo rm -rf /* 解决不了的. . . . . . . 如果有的话,赶紧跑. 
- python中基于descriptor的一些概念(上)
			@python中基于descriptor的一些概念(上) python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2 ... 
- TensorFlow函数(三)tf.variable_scope() 和 tf.name_scope()
			tf.name_scope() 此函数作用是共享变量.在一个作用域scope内共享一些变量,简单来说,就是给变量名前面加个变量空间名,只限于tf.Variable()的变量 tf.variable_s ... 
- [Python 练习爬虫] XPATH基础语法
			XPATH语法: // 定位根标签 / 往下层寻找 /text() 提取文本内容 /@xxx 提取属性内容 Sample: import requests from lxml import etree ... 
- keras写模型时遇到的典型问题,也是最基础的类与对象问题
			自己定义了一个卷积类,现在需要把卷积加入model中,我的操作是这样的: model.add(Convolution1dLayer) 这样就会报错: 正确的写法是: model.add(Convolu ... 
- [转].NET设计模式系列文章
			最初写探索设计模式系列的时候,我只是想把它作为自己学习设计模式的读书笔记来写,可是写到今天,设计模式带给我的震撼,以及许多初学者朋友的热心支持,让我下定决心要把这个系列写完写好,那怕花上再多的时间也无 ... 
- nDPI  的论文阅读和机制解析
			nDPI: Open-Source High-Speed Deep Packet Inspection Wireless Communications & Mobile Computing C ... 
