Loading

3.3 练时记录

前言

虽然似乎并不是每日一练, 但是公式化做着即可
策略分配好, 别贪, 冷静

\(\textrm{A. Condorcet Elections}\)

省流: 不会构造

出题人相思了, 想吃紫蛋了

  • 定义合法情况, 要求输出一组合法情况 / 合法情况的最值问题 / 求方案数

    • 将条件数学化
    • 往往利用 \(\rm{dp}\) , 结合约束处理当前方案数
      • 关注构造方案 / 顺序
      • 关注本质重复的转移是否存在
      • 由合法情况导出的答案
        • 先考虑最终答案的表达式 \((\)合法解的构造方案\()\) , 基础上进行 \(\rm{dp}\)
    • 找到所有情况统一的构造方案
    • 列出合法情况需要满足的表达式
      • 在原序列中贪心选择最优情况
      • 然后在基础上进行调整
  • 乱搞

    • 数据范围小
    • 答案范围小
      枚举每次操作, 剪枝

思路

题意

nn 个排列 pip_i , 我们记 α\alphapip_i 中的位置为 ρi,α\rho_{i, \alpha}
其中 α\alpha 击败 β\beta , 定义为 (i=1n[ρi,α<ρi,β])>n2\Big(\sum_{i = 1}^{n} [\rho_{i, \alpha} < \rho_{i, \beta}]\Big) > \frac{n}{2}

给定一张图, 其中边 {u,v}\{u, v\} 表示 uu 击败 vv
构造一组合法 pp 或者蟠桃

其中 n50n \leq 50

首先观察到给定的图即使成环不一定无解, 所以并不方便用图论处理
更大的原因是合法情况并非只与状态和顺序有关

可以形象化问题
给定一个图, 其中边 \(\{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}\) 维护
    • 考虑操作是否能构造出单位操作, 在用单位操作的性质去做题 \((\)一般是到了哪里就不能操作了\()\)
    • 可以考虑找可逆性 : 有了这个性质就可以把问题简化成变换到同一种形式
    • 直接正向处理
      • 构造方式

题意不再赘述

不太可能存在可逆性
从逆向思维的角度思考

发现可以直接正向思考, 找到构造方式即可

\(\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\) 个步骤。阴影柱子表示最后一步移动的柱子。
pEGf6Zn.png

第二个操作要求你解决汉诺塔问题,其中半径为 \(1、2\)\(3\) 的圆盘最初分别堆叠在柱子 \(2、3\)\(1\) 上。

第四个操作要求你解决汉诺塔问题,其中半径为 \(2,3\)\(4\) 的圆盘最初分别堆叠在柱子 \(3、3\)\(3\) 上。

思路

首先汉诺塔问题转化为从最终状态移动到初始状态
于是可以简单 \(\mathcal{O} (n)\) 处理一个询问

如何优化?
考虑单次询问的操作流程, 不难发现单个 \(p_i\) 的影响

明天再来写博客, 今天确实效率不高

posted @ 2025-03-03 21:15  Yorg  阅读(33)  评论(0)    收藏  举报