3.3 练时记录
前言
虽然似乎并不是每日一练, 但是公式化做着即可
策略分配好, 别贪, 冷静
\(\textrm{A. Condorcet Elections}\)
省流: 不会构造
出题人相思了, 想吃紫蛋了
-
定义合法情况, 要求输出一组合法情况 / 合法情况的最值问题 / 求方案数
- 将条件数学化
- 往往利用 \(\rm{dp}\) , 结合约束处理当前方案数
- 关注构造方案 / 顺序
- 关注本质重复的转移是否存在
- 由合法情况导出的答案
- 先考虑最终答案的表达式 \((\)合法解的构造方案\()\) , 基础上进行 \(\rm{dp}\)
- 找到所有情况统一的构造方案
- 列出合法情况需要满足的表达式
- 在原序列中贪心选择最优情况
- 然后在基础上进行调整
-
乱搞
- 数据范围小
- 答案范围小
枚举每次操作, 剪枝
思路
题意
求 个排列 , 我们记 在 中的位置为
其中 击败 , 定义为
给定一张图, 其中边 表示 击败
构造一组合法 或者蟠桃
其中
首先观察到给定的图即使成环不一定无解, 所以并不方便用图论处理
更大的原因是合法情况并非只与状态和顺序有关
可以形象化问题
给定一个图, 其中边 \(\{u, v\}\) 可以拆成 \(\left\lfloor\frac{k + 1}{2}\right\rfloor\) 条边, 求把每条边分给一个图, 使得总共 \(k\) 个图中不存在带环图
好吧原来是美丽构造, 那我很不会了
\(\textrm{B. Mascot Naming}\)
省流: 贪心想出来了但是蒙的, 所以自己觉得是错的
- 定义合法情况, 要求输出一组合法情况 / 合法情况的最值问题 / 求方案数
- 将条件数学化
- 找到所有情况统一的构造方案
- 逆向思维
- 列出合法情况需要满足的表达式
- 在原序列中贪心选择最优情况
- 然后在基础上进行调整
- 构造: 先推性质, 不行打表
- 找到不合法情况在什么时候出现, 通过对不合法情况的转化构造最优的合法情况
- 一般优先考虑枚举性质更多, 或者确定性更强的元素
- 先从已经确定的部分开始考虑
- 先排除无效元素
思路
先把一定无解情况判掉, 现在 \(t\) 只可能由一些 \(s\) 拼起来组成, 那么显然如果 \(t\) 和 \(s_i\) 中没有公共子序列, 这个 \(s_i\) 没有用, 直接丢掉
感性理解发现一种贪心
每次先把能不跳的用完, 然后跳一次
原来是子序列性质导致的, 我的贪心正确但是我没有意识到
\(\textrm{E. Gathering Sharks}\)
省流: 会
题面
你是一群生活在一条一维海洋中的 \(n\) 条鲨鱼的领导者。鲨鱼从左到右排列,每对相邻的鲨鱼之间相隔一个单位距离。
作为领导者,你希望所有的鲨鱼聚集在一个共同点,形成一个单一的群体。最初,没有两条鲨鱼属于同一个群体;对于每个 \(i=1,2,\cdots,n\) ,从左数的第 \(i\) 条鲨鱼形成自己的群体,编号为 \(a_i\),仅包含自己。
为了实现你的目标,你可以命令鲨鱼执行以下动作 \(n-1\) 次。
\(1\). 你喊出一个整数 \(b\),满足以下两个条件:
-
存在一个编号为 \(b\) 的群体。
-
存在至少一个编号严格小于 \(b\) 的群体。
\(2\). 然后,令 \(c\) 为严格小于 \(b\) 的最大现有群体编号,编号为 \(b\) 的群体中的所有鲨鱼同时移动到编号为c的群体的位置,并且这两个群体合并。
\(3\). 合并后的群体编号为 \(b\) ,编号为 \(c\) 的群体不再存在。
所有鲨鱼以每单位时间一个单位距离的恒定速度移动。命令必须按顺序执行,执行过程中不能重叠。一旦一个命令完成,下一个命令可以立即开始。
通过最优地命令鲨鱼执行 \(n-1\) 次动作,计算所有鲨鱼聚集在一个共同点所需的最短时间。
输入
输入的第一行包含一个整数 \(n(2\leq n\leq 500)\)。第二行包含 \(n\) 个互不相同的整数 \(a_1,a_2,\cdots,a_n(1\leq a_i\leq n)\)。
输出
输出所有鲨鱼聚集在一个共同点所需的最短时间。
示例
| 标准输入 | 标准输出 |
|---|---|
| \(4\\ 3\ 2\ 4\ 1\) | \(4\) |
| \(9\\ 1\ 2\ 4\ 5\ 7\ 8\ 3\ 6\ 9\) | \(17\) |
注意
示例输入/输出 \(\#1\) 的解释
你可以命令鲨鱼执行以下动作:
\(1\). 你喊出 \(3\)。最左边的鲨鱼移动到第二左边鲨鱼的位置,它们形成一个编号为 \(3\) 的群体。这需要 \(1\) 个单位时间。
\(2\). 你喊出 \(4\)。第二右边的鲨鱼移动到编号为 \(3\) 的群体的位置,它们形成一个编号为 \(4\) 的群体。这需要 \(1\) 个单位时间。
\(3\). 你喊出 \(4\) 。编号为 \(4\) 的群体中的鲨鱼移动到最右边的位置,形成一个包含四条鲨鱼的群体。这需要 \(2\) 个单位时间。
总时间为 \(1+1+2=4\)。可以证明 \(4\) 个单位时间是最优的。
思路
- 定义操作 (约束) 和开销 / 收益, 要求最值化开销 / 收益
- 模拟操作, 找性质
- 最优化问题的瓶颈, 考虑找最优解的性质来处理
- 逐元素处理
- 先找到统一的构造方式
- 直接处理
- 推导动态规划
- 先找到一组简单的合法解, 然后在基础上进行调整, 使其花销更优
题意不难转化成一个有向图上跳跃的问题
不难发现需要求出如何提前让一些值跳跃从而达到最优解
考虑类似区间 \(\rm{dp}\) , 很对啊
\(\textrm{F. Corrupted File}\)
省流: 思路僵化没想出来
题面
输入文件:标准输入
输出文件:标准输出
时间限制:\(2\) 秒
内存限制:\(1024\) MB
\(\textrm{WannaLaugh}\) 恶意软件是一种在互联网上传播的新型计算机恶意软件。如果计算机感染了这种恶意软件,那么恶意软件将损坏计算机中的所有文件。计算机中的文件包含零个或多个比特。恶意软件通过执行零个或多个操作来损坏文件。在一次操作中,恶意软件随机选择两个连续的比特,并将它们替换为一个比特。如果被替换的两个比特都是 \(1\),则新比特为 \(1\),否则为 \(0\)。
例如,恶意软件可能会按以下方式损坏一个比特为 \(11011011\) 的文件:
\(1\). 恶意软件选择第一个和第二个比特:\(11011011 \to 1011011\)。
\(2\). 恶意软件选择第二个和第三个比特:\(1011011 \to 101011\)。
\(3\). 恶意软件选择第三个和第四个比特:\(101011 \to 10011\)。
或者,恶意软件可能会首先选择第三个和第四个比特:\(11011011 \to 1101011\) 。
在一天开始时,你有一个包含 \(n\) 个比特的文件,记为 \(B\) 。你花了一天时间上网,包括查看你最喜欢的编程竞赛网站,就像许多 \(\textrm{ICPC}\) 参赛者会做的那样。在一天结束时,同一个文件包含 \(m\) 个比特,记为 \(C\)。你想确定这个文件是否可能被 \(\textrm{WannaLaugh}\) 恶意软件损坏,或者它是否因其他原因发生了变化。
输入
输入的第一行包含一个整数 \(t(1\leq t\leq 10000)\) 表示测试用例的数量。之后,跟随 \(t\) 个测试用例。每个测试用例的表示如下。
输入的第一行包含两个整数 \(n\) 和 \(m(1\leq m\leq n\leq 100000)\)。第二行包含一个由 \(n\) 个字符组成的字符串,每个字符是 \(0\) 或 \(1\),表示比特 \(B\)。第三行包含一个由 \(m\) 个字符组成的字符串,每个字符是 \(0\) 或 \(1\),表示比特 \(C\)。
一个输入文件中所有测试用例的 \(n\) 的总和不超过 \(100000\)。
输出
对于每个测试用例,如果文件中的比特 \(B\) 可能被 \(\textrm{WannaLaugh}\) 恶意软件损坏为比特 \(C\) ,则输出 yes,否则输出 no。
示例
| 标准输入 | 标准输出 |
|---|---|
| \(3\\85\\11011011\\10011\\33\\101\\101\\32\\101\\00\) | \(\textrm{yes}\\ \textrm{yes}\\ \textrm{no}\) |
注意
示例输入/输出 \(\#1\)的解释
第一个测试用例对应于问题描述中的示例。
对于第二个测试用例,恶意软件可能执行零次操作。
对于第三个测试用例,恶意软件不可能将比特为 \(101\) 的文件损坏为比特 \(00\)。
思路
- 定义操作, 要求把 \(a \to b\)
- 逆向思维, 把 \(b\) 拆成 \(a\)
- 用 \(\rm{STL}\) 维护
- 考虑操作是否能构造出单位操作, 在用单位操作的性质去做题 \((\)一般是到了哪里就不能操作了\()\)
- 可以考虑找可逆性 : 有了这个性质就可以把问题简化成变换到同一种形式
- 直接正向处理
- 构造方式
- 逆向思维, 把 \(b\) 拆成 \(a\)
题意不再赘述
不太可能存在可逆性
从逆向思维的角度思考
发现可以直接正向思考, 找到构造方式即可
\(\textrm{G. Tower of Hanoi}\)
省流: 啥也不会, 第一步转化没想到
题面
时间限制:\(2\) 秒
内存限制:\(1024\) MB
去年,你在参加 \(\rm{ICPC}\) 亚太区锦标赛时,了解了著名的汉诺塔问题。在这个问题中,有三根柱子和若干个半径不同的圆盘,这些圆盘可以滑动到任何一根柱子上。柱子编号为 \(1\) 到 \(3\)。在任何时候,每个圆盘都必须堆叠在其中一根柱子上,并且每根柱子上的圆盘必须按照半径从小到大的顺序从上到下排列。在每一步中,你可以将一根柱子顶部的圆盘移动到另一根柱子的顶部,前提是这个移动不会违反上述限制。目标是以最少的步骤将所有圆盘移动到柱子 \(1\)。
你正在解决这个著名问题的一个扩展。你有一个包含 \(n\) 个整数的序列 \(p_{1}, p_{2},\ldots, p_{n}\),它们的初始值已经给出。
你还被给出了 \(q\) 个操作。每个操作是以下两种之一:
更改操作:给出两个整数 \(x\) 和 \(y\)。此操作要求你将 \(p_{x}\) 的值更改为 \(y\) 。
解决操作:给出两个整数 \(l\) 和 \(r\)。此操作要求你解决汉诺塔问题,其中包含 \(r-l+1\) 个半径为 \(l, l+1,\ldots, r\) 的圆盘,其中半径为 \(i\) 的圆盘最初堆叠在柱子 \(p_{i}\) 上,对于每个 \(l\leq i\leq r\)。最初堆叠在每根柱子上的圆盘的顺序满足前面解释的限制。你需要找到将所有圆盘移动到柱子 \(1\) 所需的最少步骤数,结果对 \(998,244,353\) 取模。
你的任务是按顺序执行所有给定的操作。
输入
输入的第一行包含两个整数 \(n\) 和 \(q(1\leq n\leq 100000; 1\leq q\leq 100000)\)。第二行包含 \(n\) 个整数,表示 \(p_{1}, p_{2},\ldots, p_{n}\) 的初始值 \((1\leq p_{i}\leq 3)\)。接下来的 \(q\) 行按顺序表示要执行的操作。每行是以下格式之一:
\(1\). \(c\ x\ y\) \((1\leq x\leq n; 1\leq y\leq 3)\) 以应用更改操作,指定整数 \(x\) 和 \(y\)。
\(2\). \(s\ l\ r\) \((1\leq l\leq r\leq n)\) 以应用解决操作,指定整数 \(l\) 和 \(r\)。
输入中至少包含一个解决操作。
输出
对于每个解决操作,按顺序输出解决汉诺塔问题所需的最少步骤数,结果对 \(998,244,353\) 取模。
示例
| 标准输入 | 标准输出 |
|---|---|
| \(4\ 4\) | |
| \(2\ 3\ 1\ 3\) | |
| \(s\ 2\ 4\) | \(6\) |
| \(s\ 1\ 3\) | \(2\) |
| \(c\ 3\ 3\) | |
| \(s\ 24\) | \(7\) |
说明
对示例输入/输出 \(\#1\) 的解释
第一个操作要求你解决汉诺塔问题,其中半径为 \(2、3\) 和 \(4\) 的圆盘最初分别堆叠在柱子 \(3、1\) 和 \(3\) 上。所有圆盘可以在 \(6\) 步内移动到柱子 \(1\),如图 \(1\) 所示。
图 \(1\):将所有圆盘移动到柱子 \(1\) 的 \(6\) 个步骤。阴影柱子表示最后一步移动的柱子。

第二个操作要求你解决汉诺塔问题,其中半径为 \(1、2\) 和 \(3\) 的圆盘最初分别堆叠在柱子 \(2、3\) 和 \(1\) 上。
第四个操作要求你解决汉诺塔问题,其中半径为 \(2,3\) 和 \(4\) 的圆盘最初分别堆叠在柱子 \(3、3\) 和 \(3\) 上。
思路
首先汉诺塔问题转化为从最终状态移动到初始状态
于是可以简单 \(\mathcal{O} (n)\) 处理一个询问
如何优化?
考虑单次询问的操作流程, 不难发现单个 \(p_i\) 的影响
明天再来写博客, 今天确实效率不高

浙公网安备 33010602011771号