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-[线段树+观察]的更多相关文章

  1. AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)

    题意 小 \(\mathrm{C}\) 很喜欢二维染色问题,这天他拿来了一个 \(w × h\) 的二维平面 , 初始时均为白色 . 然后他在上面设置了 \(n\) 个关键点 \((X_i , Y_i ...

  2. [Arc063F] Snuke's Coloring 2

    [Arc063F] Snuke's Coloring 2 题目大意 给你一个网格图,一些点上有标记,求边长最大空白矩形. 试题分析 专门卡\(\log^2 n\)系列. 首先由题意我们可以找到答案的下 ...

  3. 【arc073e】Ball Coloring(线段树,贪心)

    [arc073e]Ball Coloring(线段树,贪心) 题面 AtCoder 洛谷 题解 大型翻车现场,菊队完美压中男神的模拟题 首先钦定全局最小值为红色,剩下的袋子按照其中较大值排序. 枚举前 ...

  4. HDU 4027 Can you answer these queries(线段树 + 观察 )

    这题主要考察观察能力. 2^63最多只需要开7次根号就会变成1,当数字变成1之后就不需要再对其进行操作. 对于含有大于1数字的区间,向下更新. 对于数字全为1的区间,直接返回. #include &l ...

  5. 洛谷P3960 列队(动态开节点线段树)

    题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...

  6. 2018.09.22 atcoder Snuke's Coloring 2(线段树+单调栈)

    传送门 就是给出一个矩形,上面有一些点,让你找出一个周长最大的矩形,满足没有一个点在矩形中. 这个题很有意思. 考虑到答案一定会穿过中线. 于是我们可以把点分到中线两边. 先想想暴力如何解决. 显然就 ...

  7. 【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 ...

  8. 【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 ...

  9. [USACO2005][POJ3171]Cleaning Shifts(DP+线段树优化)

    题目:http://poj.org/problem?id=3171 题意:给你n个区间[a,b],每个区间都有一个费用c,要你用最小的费用覆盖区间[M,E] 分析:经典的区间覆盖问题,百度可以搜到这个 ...

随机推荐

  1. Mac下安装Spark

    1.Scala 官网下载scala安装包后解压,路径随意. 编辑/etc/bash_profile添加$SCALA_HOME并修改相应PATH 2.SSH无密码登陆 ssh-keygen -t rsa ...

  2. Input and Output-The input is all the sources of action for your app

    Programs take input and produce output. The output is the result of doing something with the input. ...

  3. ROIPooing

    暂时不纠结 faster rcnn 最后一步是不是全连接层(gluoncv里面是rcnn层): 说一下feature map 和 anchor (Proposal) 作为输入,怎么计算ROIPooin ...

  4. [USACO11JAN]Roads and Planes

    嘟嘟嘟 这道题他会卡spfa,不过据说加SLF优化后能过,但还是讲讲正解吧. 题中有很关键的一句,就是无向边都是正的,只有单向边可能会有负的.当把整个图缩点后,有向边只会连接在每一个联通块之间(因为图 ...

  5. 2、Android-UI(布局待完成)

    2.3.布局 实现界面的整齐摆放各种控件需要使用布局来完成 布局是一种可用于放置很多控件的容器 可以按照一定的规律调整内部的控件位置 布局的内部不仅可以放置控件还可以放置布局 1.线性布局 Linea ...

  6. 2、Android-UI(常用控件)

    2.1.如何编写程序页面 Android中有许多编写程序的方式可供选择 Android Studio和Eclipse中都提供了响应的可视化编辑器 可以直接再进行拖动创建布局 推荐使用手动编写方式进行开 ...

  7. Selenium封装

    import os from selenium import webdriver from selenium.webdriver.common.by import By from selenium.w ...

  8. nRF5 SDK for Mesh(二) Getting started 快速开始

    Getting started To get started, take a look at the Light switch demo. It shows how a simple applicat ...

  9. C#中如何利用操作符重载和转换操作符 (转载)

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  10. spring boot 配置Rabbit

    单独安装Rabbit服务并设置启动,可以通过浏览器访问,一般访问地址是http://localhost:15672/ ,用户名密码看配置文件的用户名密码 1 实例化配置类注解 import org.s ...