Day1

「JOISC 2017 Day 1」开荒者

首先观察部分分发现分档很多,于是考虑一步步思考上来。

首先有一点关键观察(一):

  • 风吹的顺序是无所谓的,令分别往东、西、南、北吹了 \(r, l, d, u\) 次,那么每个初始有草的位置往北 \(u\) 往南 \(d\) 往东 \(r\) 往西 \(l\) 个单位都会被其草籽覆盖且只有这些位置被覆盖。

那么一个简单的想法是直接枚举 \(r, l, d, u\) 然后求矩形并判定,复杂度 \(\mathcal{O}(r ^ 3c ^ 3)/\mathcal{O}(r ^ 2c ^ 2n \log n)\),然后可以通过简单的优化通过第二个包,这里略过。

观察第三个包,很明显就是在提示我们可以在一个维度用多项式复杂度算法,令一个维度随意,那么基础的想法就是去除掉一个维度的限制。

因此首先考虑只有一个维度怎么做:最左最右的草限定了往左 \(a\) 往右 \(b\) 至少要吹多少次,中间的间距限定了往左右分别要吹多少次 \(c\),那么 \(\max(a + b, c)\) 就是答案。

因此我们考虑只枚举 \(l, r\),那么每行就变为了上面的一维问题,注意到本质不同的行只有区间端点个,因此复杂度 \(\mathcal{O}(c ^ 2n ^ 2)\)(当然为了通过第三个包要改为枚举 \(u, d\) 是类似的)

接下来看起来就要给出一个多项式做法,当值域较大的 稀疏图 而枚举量涉及值域大小的时候,通常考虑减少不必要的枚举,那么就要从枚举 \(l, r\) 上下功夫。

此时我们有如下观察(二):

  • 一定存在一个最优方案使得至少有一株草的左边界或右边界要恰好卡在整个区域的左右边界上。

假设不存在,若 \(l > 0\) 则考虑将 \(l \leftarrow l - 1, r \leftarrow r + 1\) 也就是将所有草的区间向右整体平移一格,那么容易发现此时南北方向上的最优解不变,一定能调整到观察中的情况。

否则一定至少有一株草就在左边界上,矛盾。

那么不妨考虑左边界被卡的情况,右边界同理,此时合法的 \(l\) 取值只有 \(\mathcal{O}(n)\) 种。

此时继续类似地观察(三)有:一定存在一种最优方案使得右边界要么被卡,要么使得至少存在两个区间左右端点恰好相邻。

因此此时的有效右端点数量只有 \(\mathcal{O}(n ^ 2)\) 个,那么总共的左右端点有效数量就为 \(\mathcal{O}(n ^ 3)\) 个,此时我们再去做原先的暴力,复杂度 \(\mathcal{O}(n ^ 5)\).

发现直接暴力的过程太冗杂了,考虑优化上面暴力的计算。

根据观察二的证明,发现在线段整体平移的过程中有很多列的计算是重复的,于是对 \(l + r\) 相同的区间一起考虑。

转换一个思路:将所有线段视作不动,而将整个区域在线段上面移动。

由上面对有效 \(l, r\) 的分析可以看出有效的 \(l + r\) 长度来源于两个部分:

  • 左边界右边界均被卡,这里数量是 \(\mathcal{O}(n ^ 2)\) 的。
  • 左边界被卡,\(r\) 使得存在两个区间左右端点相邻,注意到这里区间长度总是两点之间距离,因此也是 \(\mathcal{O}(n ^ 2)\) 的。

因此我们发现本质不同的 \(l + r\) 至多 \(\mathcal{O}(n ^ 2)\) 种。

那么将所有关键列(区间左端点,右端点后面一个点)提取出来抽象成点,有三个属性 \(a, b, c\) 即一维问题下定义的三个量,那么问题就是求所有长度固定区间的 \(\max a, \max b, \max c\) 直接用单调队列维护即可。

瓶颈在于计算所有 \(l, r\) 的关键列上的属性,根据上面的分析关键列是 \(\mathcal{O}(n)\) 的,复杂度 \(\mathcal{O}(n ^ 4)\).

考虑继续解决这个瓶颈,注意到关键列上的元素不减,那么这本质上就是维护了 \(\mathcal{O}(n)\) 个序列,每个序列支持插入一个元素(插入总次数为 \(\mathcal{O}(n ^ 2)\)),查询每个序列的最大值,最小值,和相邻大小元素差的最大值。

这是一个经典问题,倒序处理上述三个值均有单调性,用链表维护,复杂度 \(\mathcal{O}(n ^ 3)\).

当然最后这个维护部分不是瓶颈,也可以用 set 偷懒。

「JOISC 2017 Day 1」港口设施

首先发现两个相交的区间不能放进同一个栈,因此可以发现一个栈是合法的当且仅当其中的所有区间只有包含或相离关系。

如果我们把相交但不包含的区间之间连边,那么问题就转化为二分图染色问题,考虑优化连边。

首先将每个区间的连边转化成比较好观察的形式:将所有区间按照左端点排序,按照右端点依次考虑连边,每连一个区间就删掉这个区间,那么每次连接的区间都是排序后连续的一段。

我们发现,每次连一段区间的意义是:钦定这段区间内点的颜色全部相同并且与当前点颜色不同,那么之前已经连过的区间一定可以保证颜色相同,所以当前区间和之前区间的交集就可以只连一条边。

那么我们用并查集维护颜色相同的区间,这样每次连接一个区间就只需要连接其分成的若干个颜色不同的连通块就可以了,这样连接的总边数就降低到了线性。

需要注意的是,我们需要支持删点。

观察这里的操作,我们发现并不需要真的把点删掉,可以将已经删去了的点同样加入颜色维护的联通块。

并且我们如果需要向一个 与当前区间交集存在点没被删 的联通块连边,那么连接其中任何一个点都是可以的(包括被删的点)

因此我们还需要再维护一个并查集(或者链表)来跳过当前被删过的点,复杂度 \(\mathcal{O}(n\alpha(n))\).

JOISC 2017的更多相关文章

  1. JOISC 2017 Day1 T3 烟花棒

    JOISC 2017 Day1 T3 烟花棒 题意: ​ 数轴上有\(N\)人在放烟花,一开始只有第\(K\)个人的烟花是点燃的,烟花燃烧的时间为\(T\)秒,求让所有人的烟花都可以点燃的速度的最小值 ...

  2. 「JOISC 2017 Day 3」幽深府邸

    题解: 和hnoi2018day2t1基本一样 我想了半小时想出了一个很麻烦的做法 写了之后发现假掉了 刚开始想的是 先预处理出每个门要打开至少要在左边的哪个点$L[]$,右边的哪个点$R[]$ 对每 ...

  3. JOISC 2017 自然公园

    吐槽 YMD的课件是真的毒,YYB的也很毒. 题目链接 LOJ sol 我是一个一个Subtask做的... Subtask 1 \(O(n^2)\)枚举每两个点有没有边即可. Subtask 2 链 ...

  4. loj2395 [JOISC 2017 Day 2]火车旅行

    传送门 分析 我们知道无论往左走还是往右走一定都是往不低于这个点的地方走 于是我们可以考虑用倍增来维护一个点向左和向右走$2^i$最远分别能走到哪里 我们可以先用单调栈求出直走一步的情况,之后再处理倍 ...

  5. loj 2392「JOISC 2017 Day 1」烟花棒

    loj 答案显然满足二分性,先二分一个速度\(v\) 然后显然所有没有点火的都会往中间点火的人方向走,并且如果两个人相遇不会马上点火,要等到火快熄灭的时候才点火,所以这两个人之后应该在一起行动.另外有 ...

  6. loj#2391 「JOISC 2017 Day 1」港口设施

    分析 https://yhx-12243.github.io/OI-transit/records/uoj356%3Bloj2391%3Bac2534.html 代码 #include<bits ...

  7. WC2019 题目集

    最近写的一些 WC2019 上讲的一些题.还是怕忘了,写点东西记录一下. LOJ2983 「WC2019」数树 题意 本题包含三个问题: 问题 0:已知两棵 \(n\) 个节点的树的形态(两棵树的节点 ...

  8. 退役前的最后的做题记录upd:2019.04.04

    考试考到自闭,每天被吊打. 还有几天可能就要AFO了呢... Luogu3602:Koishi Loves Segments 从左向右,每次删除右端点最大的即可. [HEOI2014]南园满地堆轻絮 ...

  9. ZJOI2019Round#2

    乱听课记录 关于树的分治问题&杂题选讲 张哲宇 边分治 (边分不是很鸡肋吗) 例题一 题目大意:给出两颗有正负边权的树,求出两个点\(u,v​\)使得两棵树中\((u,v)​\)距离的和最大. ...

随机推荐

  1. Boost的反射库PFR

    目录 目录 简介 使用方法 限制 总结 简介 Boost.PFR是一个Boost 1.75版本出的C++14的基础反射库,其使用非常简单,非常便捷,但是适用性也比较差,有很多的地方无法使用,适合比较简 ...

  2. Are Loss Functions All the Same?

    目录 概 主要内容 一些假设 损失函数 损失函数的统计性质 收敛速度 分类的界 Rosasco L, De Vito E, Caponnetto A, et al. Are loss function ...

  3. 以简御繁——介绍IOC

    1.IOC的理论背景 大家开发理念,一直都是奔着架构稳定.低耦合性.而IOC初衷,就是为了解决模块依赖问题,理解<六大设计原则(SOLID)> 如图所示,在我们开发中,业务的实现,就是靠着 ...

  4. [opencv]drawContours 示例

    vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(img_canny,co ...

  5. .NET 云原生架构师训练营(设计原则&&设计模式)--学习笔记

    目录 设计原则 设计模式 设计原则 DRY (Don't repeat yourself 不要重复) KISS (Keep it stupid simple 简单到傻子都能看懂) YAGNI (You ...

  6. shc命令

    今天在公司看到业务系统有一个query.viewtx 等等命令.虽然不知道是什么语言写的,但是里边内容是看不到的. 如果是编译型语言这样的结果 我并不奇怪.但是如果我们写了一个shell脚本 如果加密 ...

  7. Centos7安装erlang以及RabbitMQ Centos启动rabbitmq

    本文使用版本:  rabbitmq-server-3.8.3-1.el7.noarch.rpm   Centos7  erlang  22.3.1 在线安装 yum install esl-erlan ...

  8. Springboot集成邮箱服务发送邮件

    一.前言 Spring Email 抽象的核心是 MailSender 接口,MailSender 的实现能够把 Email 发送给邮件服务器,由邮件服务器实现邮件发送的功能. Spring 自带了一 ...

  9. 【代码优化】Bean映射之MapStruct

    [代码优化]Bean映射之MapStruct 一.背景 领域模型相互转换就只能靠手工的 get()/set()? 普遍的做法有以下几种: 手工 get()/set(): 构造器: BeanUtils ...

  10. 【PTA】5-2 下列程序读入时间数值,将其加1秒后输出,时间格式为:hh: mm: ss,即“小时:分钟:秒”,当小时等于24小时,置为0。

    5-2 下列程序读入时间数值,将其加1秒后输出,时间格式为:hh: mm: ss,即"小时:分钟:秒",当小时等于24小时,置为0. #include <stdio.h> ...