[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] 分析:经典的区间覆盖问题,百度可以搜到这个 ...
随机推荐
- Java对文件的读取方式以及它们的优缺点
Java常用的对文件的读取方式基本包括: BufferedReader -> readLine(): 按行读取文件,直到读取内容==null FileInputStream -> read ...
- [CQOI2006]凸多边形(半平面相交)
嘟嘟嘟 本来我要写feng shui这道题的.然后网上都说什么半平面相交,于是我还得现学这个东西,就来刷这道模板题了. 所谓的半平面相交和高中数学的分数规划特别像.比如这道题,把每一条边看成一条有向直 ...
- POJ1039 Pipe
嘟嘟嘟 大致题意:按顺序给出\(n\)个拐点表示一个管道,注意这些点是管道的上端点,下端点是对应的\((x_i, y_i - 1)\).从管道口射进一束光,问能达到最远的位置的横坐标.若穿过管道,输出 ...
- x-frame-options、iframe与iframe的一些操作
iframe的子操作父窗口,父操作子窗口: test.php: <!DOCTYPE html> <html> <head> <title>test< ...
- 容器适配器(一):queue
除了标准的顺序容器外,STL还提供了3种容器适配器,queue,priority_queue和stack 适配器是对顺序容器的包装,它的作用是简化接口. queue接口十分的简单,只有8个方法.再加上 ...
- Kubernetes 学习2 k8s基础概念
一.架构描述 1.基本架构 2.pod ,有两类 a.自主式pod 自我管理的,创建之后,任然是需要提交给API Server,API Server接受之后然后由调度器调度到指定的 node节点,由n ...
- Powerdesigner设置表字段注释与name相同
Powerdesigner设置当表字段注释为空时与name相同 1.在Database-->edit Current DBMS-->script-->objects-->col ...
- 微服务前端开发框架React-Admin
前言 React-Admin是基于React16.x.Ant Design3.x的管理系统架构. 采用前后端分离,内置了许多管理系统常用功能,通过一些脚本.封装帮助开发人员快速开发管理系统,集中精力处 ...
- sqlplus连接半天才连上
问题现象: 某oracle数据库服务器发现使用ssh,crt连接半天1-2分钟后才返回输入密码的提示,应用人员发现使用 sys_GUID()函数获取唯一值的时候,第一次调用需要等待很长时间,但是同一s ...
- CUBE,ROLLUP 和 GROUPING
1.用 CUBE 汇总数据 CUBE 运算符生成的结果集是多维数据集.多维数据集是事实数据的扩展,事实数据即记录个别事件的数据.扩展建立在用户打算分析的列上.这些列被称为维.多维数据集是一个结果集,其 ...