IOI2021 集训队作业(一)
有生之年。
233. Rubik's Rectangle
给定一个
时间复杂度:
题解
不妨假设 n, m 都是偶数(如果是奇数那么中间的一行或列可以独立)。
可以发现可以把格子染色,每种颜色恰好四个格子,满足任意翻转操作后颜色矩阵不变。
不妨假设每个数字在正确的颜色位置上。考虑每个颜色内的四个点,可以发现如果这些点构成偶排列那么就总可以在不影响其他颜色的前提下把这四个点排好序,如果是奇排列则总是不能。称每个颜色的左上角的点为代表点,把颜色的排列奇偶性作为标记放到代表点上,对于代表点标记构成的 01 矩阵 A ,如果 A 是全 0 矩阵自然是有解的。
而每次翻转对 A 的影响就是讲某一行或某一列的 01 给全部反转,因此只要能通过这个操作把 A 弄成 01 矩阵就能得到解,这就是个很 simple 的贪心了。
数据
这 spj 真难写。
不难想到如果随机选择一个排列放到网格上,那么极大的概率是无解。采用逆推的方式,从一个排好序的网格随机执行若干次操作得到一个打乱的网格,这样就可以保证数据有解。在此基础上加上一些扰动改变一些代表点的奇偶性即可得到强度较大的无解数据。
234. Hiking in the Hills
在三维空间上给定一个曲面,该曲面由
保证任意直线
时间复杂度:
题解
容易发现这条折线可以只走三角形端点,把三角形端点和起点终点拿出来建图然后把点按高度排序,用个并查集维护即可。
数据
这 spj 真难写。
这题造数据比写标程难。先确定所有三角形端点,再构造三角形,把端点投影到 xy 平面上,那么构造三角形就是在平面上求一组三角剖分。
235. Single Cut of Failure
有一个矩形,称一条端点落在矩形的不同的两条边的线段为合法线段。给定
时间复杂度:
题解
比较降智的一点是,添加两条对角线总是满足条件的。那么我们只需要关注是否可以找到一条合法线段与所有给定线段有交。
把矩形的边展开为一个数轴,每个给定线段对应数轴上一段区间,那么目标是选两个点满足它们所在的区间的集合的不交并是全集。假设区间没有包含关系,排个序后枚举一个点双指针处理另一个点即可。对于有包含关系的区间,稍加特殊处理就可以合并为一个区间。
数据
这 spj 真难写。
不难想到如果在矩形内随机给出
121. Bipartite Blanket
给定一个二分图,左右分别
时间复杂度:
题解
对于点集
必要性很显然,证明充分性,假设已知一个覆盖
那么把两边的能被匹配覆盖的点集分别处理出来排个序然后双指针即可。
122. Intellectual Property
有三个三元组
- 选择两个数字
并把所有 变为 ,把所有 变为 。 - 选择同一三元组的两行交换。
- 交换两个三元组对应的行。
- 选择同一三元组的两列交换。
- 交换两个三元组对应的列。
- 沿左上-右下对角线翻折。
给定
时间复杂度:
题解
容易发现由于存在三元组的限制,行和列的置换数都是
对角线翻折操作最多只进行一次,并且如果需要进行的话可以在任意时刻进行,因此如果需要这个操作不妨假定它在最后,额外检查一次即可。
123. Gem Island
以前做过,略。
134. J
给定一个长为
特别地,每个子表达式中关于
时间复杂度:
题解
直接把向量拿进去模拟运算的话瓶颈复杂度
146. Tile Cutting
对于一个
的四个顶点分别落在 的四条边上。 的四个顶点恰好落在格点上。
设
被 包裹。 的面积恰为 。
时间复杂度:
题解
把面积关于平行四边形的位置的式子写出来,稍加整理,不难发现
FFT 即可。
153. Fygon 2.0
给定一个 for
循环,循环的左边界要么是前文出现过的循环变量要么是
时间复杂度:
题解
首先不难注意到一个 for
循环就是一个形如
按不等关系连边,显然 SCC 内的值要相同,缩点得到一张新图
由于渐进复杂度是在
由于我们只关心变量之间的大小关系,按变量从小到大得到排列
173. Equal Numbers
给定长为
对于每个
时间复杂度:
题解
设
- 选
个数修改为 。 - 选
个数修改为已经在数列中存在的数。
分别考虑两种情况。对于情况 1 ,贪心从出现次数最少的数开始修改即可。对于情况 2 ,把能够修改的数拿出来按情况 1 的方法贪心即可。
133. Chain & Co.
在三维空间上给定
时间复杂度:
题解
首先矩形一定平行于某个轴平面,两个矩形连接的一个必要条件是它们平行的轴平面不同。那么所平行的轴平面相同的矩形必须分在同一组。由于轴平面只有三个,那么分组的方式只有三种,枚举三种情况,问题转换为判断两组矩形是否两两连接。
不妨假设一组矩形全部平行于 x-y 平面(称为 A 组,另一组为 B 组),那么 B 组的矩形在 x-y 平面上的投影总是一个线段。考虑 B 组的矩形的 z 轴坐标要满足什么限制,显然每个 B 组矩形的 z 轴坐标范围内要包含所有 A 组矩形的 z 轴坐标,这个很好判断,接下来的问题忽略 z 轴而转换为二维平面上的问题。
现在的问题是,对于每个线段,判断其是否与每个矩形都连接,这里线段和矩形连接当且仅当线段一个端点在矩形内另一个端点在矩形外。不妨假设这些线段都是平行于 x 轴的,同样地我们可以先考虑 y 轴上的限制,和 z 轴的判定类似,接下来问题可以进一步放到数轴上。在数轴上问题最终转换为有 C, D 两组线段判断是否存在一个 C 组线段完全包含一个 D 组线段,排个序双指针即可。
145. Cow Confinement
在平面上给定
时间复杂度:
题解
很佩服官方题解,全文一句话也没有说,仅仅通过几张示意图就把核心思想描述地很清楚,剩下的部分就是简单的数据结构。
假设没有矩形的阻挡,那么问题就是查询矩形内的花的数量,但还可以这样描述,把花看做向 y 负方向的射线,把牛看做向 x 正方向的射线,那么牛能到的花的数量就对应于射线的交点数量。
考虑矩形的阻挡,如果牛的射线经过一个矩形,那么事实上的影响就是把当前射线分成两部分,经过矩形前是一个线段,经过矩形后是一个新的射线,新的射线沿着矩形边想 y 正方向移动。特别地,如果触碰到的矩形边是矩形内的话,就不会有新的射线。同理处理花的射线,但是注意到花的射线拆分后一个花可能对一头牛贡献多次。把花的射线拆分归则稍加修改即可。
爬两张官方题解的图,其中 A, B 分别是牛和花,蓝色的即牛对应的射线,红色的即花对应的射线。
总而言之,矩形的影响就是让经过它的射线发生“偏移”,最后转换的问题仍然是有若干横向射线,若干纵向射线,求每个横向射线与多少纵向射线有交点这样的问题。扫描线加树状数组即可。
255. Money for Nothing
在二维平面上给定
时间复杂度:
题解
不妨假设白点和黑点都是横纵坐标同时单调递减的(否则的话一定存在一个点可以完全替代另一个点)。
然后考虑对于每个白点求对应的最优的黑点,不难想到是最优黑点是单调的,因此决策单调分治处理即可。
特别地,有些白点压根没有合法的黑点与它构成矩形,这种情况需要稍加处理。
293. Weather Report
给所有长度为
最小化选中的四进制数的编码的长度的数学期望。
时间复杂度:
题解
把所有四进制数的编码建 Trie ,由于编码之间两两没有前缀关系,那么 Trie 的单词节点两两没有祖先关系。一个 Trie (即编码方式)的代价就是每个叶子的权值(对应的四进制数的出现概率)乘上其深度的和。
而最小化这个 Trie 的代价是很简单的,每次贪心选两个最小的叶子合并即可。
唯一的问题在于节点数
这个最优编码就是 Huffman 编码,上文的 Trie 树就是 Huffman 树,上文的贪心算法就是构建 Huffman 树的一个常用算法。
事实上,由于需要记录一类权值的数量,而这个数量
如果数量
101. Correcting Curiosity
给定两个不相等的非空串 s/A/B/g
命令后得到的串恰为
时间复杂度:
题解
直接从
预处理
102. Replicate Replicate Rfplicbte
对于一个无限大的 01 矩阵,每一次变化定义为依次执行两个操作:
- 把每个位置变成操作前其相邻共九个位置的异或和。
- 选择至多一个位置将其取反。
定义一个无限大的 01 矩阵的大小为,能包含所有 1 的子矩阵的面积的最小值。
现给出一个矩阵
时间复杂度:
题解
首先注意到,无论有没有二操作,每一次变化后,矩阵的“边界”都会想上下左右四个方向个扩展至少一格。
通过这一点,如果没有二操作,对于一个矩阵
具体方法就是递推,把
考虑如果有二操作,怎么找到二操作的执行位置。
假设我们逐行递推,那么每一行只有
来做第一个留言的人吧!