1 Problem A. Endless Punishment
1.1 超简要题解
我们用0来代表白色,用1来代表黑色,考虑将状态加一维使之齐次,则每个状态可以视为一个n + 1维的向量。这样每一步对应的两种操作就可以用一个异或意义下矩阵来表示。注意到第一个子集一定包含1实质上是说明了矩阵一定可逆。这样我们就可以用类似 BSGS 的方法去做了。
2 Problem B. Redraw Beautiful Drawings
2.1 题解
第一步,考虑如何求是否有解。使用网络流求解,每一行和每一列分别对应一个点,加上源点和汇点一共有N+M+2个点。有三类边:
1. 源点 -> 每一行对应的点,流量限制为该行的和
2. 每一行对应的点 -> 每一列对应的点,流量限制为 K
3. 每一列对应的点 -> 汇点,流量限制为该列的和
对上图做最大流,若源点出发的边和到达汇点的边全都满流,则有解,否则无解。若要求构造方案,则 (i,j) 对应的整数就是行 i–> 列 j 的流量。
第二步,考虑解是否唯一。显然,解唯一的充分必要条件是完成最大流后的残余网络没有长度大于 2 的环。所以,判断解的唯一性可使用dfs,注意遍历的时候不可以在走完一条边后马上走其反向边,加此限制检查是否有环即可判断解是否唯一。
至此,全题已解决。
3 Problem C. Scary Path Finding Algorithm
3.1 简要题图
图上第一个三角形,-8的位置对应了-2^n,-4的地方对应了-2^(n-1),后面按照类似的规则延伸下去即可,这样构造需要2n+1个点,可以使题中给出的算法的运行次数达到2^n。
4 Problem D. One to Four
4.1 题目大意
一个n × m 的矩阵,每格有一个正整数,把它分成4块相同的联通子集,(“相同”的定义是可以通过适当旋转和平移使得两个联通子集完全重合),然后将这 4 块通过适当旋转和平移完全重合在一起,你的任务是选择一种切割、重叠的方式,使得得到的重叠后的图形每个格子上属于四个部分的四个数字加起来,最小的和尽量大。
4.2 简要题解
任何分成的4块不是长方形的方案均可以等价对应到一个分成4块长方形的方案,只需要考虑 把一个长方形分成4个相同的长方形的方案就可以了。几个比较坑的情况(假设n>m):
1.3n = 4m 时可以一横三竖划分。
2. n = 2m 时可以两横夹两竖。
3.当有的方案是分成 4 个正方形时,注意正方形可以 90°旋转。
5 Problem E. The Great Pan
5.1 题目大意
输入包含 $ $ 及 {a|b|c} 这样的标记的文本,对于 {a|b|c} 这样的标记,答案乘里面 | 的数量 +1。对于 $ $ 这样的标记,在内部每遇到 n 个连续的空格就把答案乘 n + 1。如果答案不超过 100000,输出答案,否则输出 doge。
总之,题目说什么,就怎么做就可以了。
5.2 题目定位
签到题。
5.3 简要题解
总之,题目说什么就怎么做就可以了,小心中间运算结果超出 32 位int类型的表示范围。
6 Problem F. Defence of the Trees
6.1 题目大意
一个2D平面上有 n 棵树(用点表示),每棵树有个种类 Ai,m 个木桩(用点表示)。一共有 k 种树,你可以用线连接木桩,绕成一个简单多边形,使得内部包含所有 k 种树,同时线的总长度尽量短。
6.2 简要做法
首先最优解肯定是一个凸多边形,如果是凹多边形的话我们把凹的地方补上可以得到不更差的答案。
一个凸多边形一定存在一种类似链结构的三角剖分,即如果我们把三角形当作点,有两个公共顶点的三角形之间连边的话,一定存在一种三角剖分使得三角形呈一个链结构。
所以最优解一定可以被表示成一个由个三角形组成的图中的一条链,把三角形A到三角形B的边权定义为三角形 B 的其他两边长度减去公共边长度,原问题转化为给定一个无向图,点上有标记(可能多个),找一条包含所有 k 种标记的最短路。直接状压 + 类似最短路转移即可。
7 Problem G. Wow! Such Sequence!
7.1 简要题解
区间树,又称线段树,是一种很有趣并且(在国内赛区)也很常用的数据结构。
维护区间的和是线段树的经典入门用法,由于增加一个数的修改只有单点,我们顺便维护一下区间变最近 Fibonacci 数之后的和即可。执行第三种操作时直接打上标记,更新即可。
时间复杂度较为显然,为 N log N 。
8 Problem H. Mart Master
8.1 题目大意
S 市有 n 个区,有 n − 1 条双向道路连接这些区,使得区与区之间可以互达,有些区已经建立了属于别的公司的超市,人们在购物时会选择去距离最近的超市,如果有多个,选择编号最小的区的 超市。
Dogy 作为一名超市大亨,想要占领 S 市的市场,他的资金足够支持在 m 个区建立超市,不能在已经有超市的地方建造,现在 Dogy 想知道,选择哪 m 个区建立超市,能吸引到最多的区的顾客?
8.2 简要题解
算出在每个点建立超市能够 “占领” 哪些地区,然后定义 fi,j,k 为点 i 的子树中,放了 j 个超 市,在计划中地区 i 被地区 k 的超市 “占领”,转移时对儿子做背包,可以得到一个时间复杂度 看起来为 O(n4) 的做法。
实际上这个做法的时间复杂度是 O(n3) 的,证明如下:点 i 枚举到第 j 个儿子时,令 curSize 为前 j − 1 个儿子的节点总数,则这次背包的枚举量为 curSize × sizej ,不难发现这样做的话,每对节点只会被枚举到一次,所以树形背包部分的时间复杂度是 O(n2) 的,乘上第三维 O(n)的状态就是 O(n3)。
9 Problem I. Paper
9.1 题目大意
题目给了一个凸包,与一些圆,要求从凸包中将这些圆挖去。圆可以包含甚至相同。问将一个顶 点作为中心,凸包稳定后的坐标。
9.2 题解
考虑何时会变成稳定状态。根据物理的知识,我们知道,当物体重心位于最低点时,整个物体是最稳定的。于是我们要求出挖除圆后的重心在哪儿。根据重心的性质,我们可以用凸包的重心 × 凸包的面积减去圆并的重心 × 圆并的面积。对于一个弓形的重心,可以用积分求出。于是将求圆并的变成求重心的代码即可。最后将重心旋转到选定顶点的正下方即可。
10 Problem J. Minimal Spanning Tree
10.1 题目大意
给定一个由一段代码生成的无向图,计算其最小生成树,图的简单性质:有边相连的点编号之差不超过 5。
10.2 简要题解
注意到 90754 ≡ 1 mod 2333333,即对于所有 i > 5,点 i 向前连的所有边的权值和点 i + 9 向前连的所有边的权值相同。同时点 i 向前最远也只能连到点 i − 5,也就是说,如果我们已经连完1 . . . i − 1的点的出边,此时点i − 5 . . . i 和点 1 . . . i − 6所组成的部分还是不连通,那么一定无解。 所以如果我们按编号顺序连边的话,只需要考虑当前点和当前点之前的最多 5 个点的联通情况。5 个点的联通情况至多只有 52 种,直接 dpi,j 表示考虑到点 i,点 i − 5 . . . 点i − 1的联通情况是第j 种的最小代价。这个 dp 是可以用矩阵转移的 (类似 Floyd 算法). 由于图有周期性,所以可以算出一个周期的转移矩阵,中间部分的完整周期可以用矩阵倍增来加速,总的复杂度 O(log N × 523)。
11 一些吐槽
1. B 题似乎有一些跑的不是那么快的网络流被卡了,并不是本意,只是标程和验题人写的程序都是Dinic。最后时限又简单粗暴的 3 倍了一下标程运行时间,就坑了。sad :(
2. B 题的出题人是个妹子。
3. 开场前两个提交居然都是输出 Hello World!。
4. 然后就有一大堆队伍交了 J 题的裸暴力上来……还有队伍吐槽生成完边就 TLE 了……
5. J 题有几个队伍的做法比标程漂亮很多,Orz!
6. 为什么你们会认为 C 题会无解呢……要是只能卡到 N × M 还出成题做什么啦……
7. E 题看到前几个队伍的提交才发现题目在 OJ 上排版排错了还没发现,早知道就放出 pdf 保平安了(排版人表示 so sorry~~)。
8. H 题可能有点卡内存,某 OJ 觉得所有题目都开很大内存会影响他们 OJ 的稳定性(?),所以为了不剧透只好这样了(某OJ解释一下,标程不卡空间,所有题目一半内存足矣啊)。
9. H 题每次全部 memset 就会有点慢,这个我们也没办法,HDOJ 不支持多个输入文件,小数据又有点多 T_T
10. A 题也有一堆队伍交暴力模拟上来……
11. 你说你们怎么不把写 A 题暴力模拟 J 题暴力生成树的码力都拿来写 E 题呢……
12. 为什么会有队伍认为读一个题面能读出 0 种意思呢……
13. E 题换行不可以隔开连续空格有点违反常识,这个题目没有特别说明确实很抱歉。
14. F 题裸搜真的过不了,不要再搜了 QAQ,状压大法好。