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. 01 Java基础

    Java基础 01 Hello 随便新建一个文件夹,存放代码 新建一个Java文件 文件后缀名为.java Hello.java [注意点]系统可能没有显示文件后缀名,我们需要手动打开 编写代码  p ...

  2. Java练习小题_猴子吃桃问题分别用for循环和while循环实现程序。

    要求说明: 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时, ...

  3. linux 之 非root用户安装mysql5.7.27

    下载 下载 mysql-5.7.27-linux-glibc2.12-x86_64.tar.gz 详见linux(CentOS7) 之 MySQL 5.7.30 下载及安装. 配置规划 用户: zhj ...

  4. nginxWebUI

    nginx网页配置工具 github: https://github.com/cym1102/nginxWebUI 功能说明 本项目可以使用WebUI配置nginx的各项功能, 包括http协议转发, ...

  5. nginx - win系统启动一闪而过 ,服务没有启动成功

    这种现象是因为配置文件里配置的服务监听端口被占了

  6. go 使用 sort 对切片进行排序

    golang对slice的排序 golang里面需要使用sort包,并且实现几个接口Len, Swap, Less sort 包排序demo 假如现在有个slice 叫做 ids 里面保存的数据类型是 ...

  7. sqlcl - Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file

    运行sqlcl的命令sql出错 bash-4.2$ sql username/password@hostname:1521:databasename Exception in thread " ...

  8. javascript错误类型

    ECMA-262 定义了下列 7 种错误类型,简单说明如下: Error:普通异常.通常与 throw 语句和 try/catch 语句一起使用. 利用属性 name 可以声明或了 解异常的类型,利用 ...

  9. 基于Dapper的分布式链路追踪入门——Opencensus+Zipkin+Jaeger

    微信搜索公众号 「程序员白泽」,进入白泽的编程知识分享星球 最近做了一些分布式链路追踪有关的东西,写篇文章来梳理一下思路,或许可以帮到想入门的同学.下面我将从原理到demo为大家一一进行讲解,欢迎评论 ...

  10. Mysql存储过程二

    1.MySQL中创建存储过程时通过DEFINER和SQL SECURITY设置访问权限 procedure与function.trigger等创建时紧接着CREATE都有个definer可选项,该de ...