2024ICPC昆明

比赛链接

B. Brackets

首先,选出的两段要么均为空,要么一个为一堆左括号,另一个为一堆右括号且它们互补。

考虑给定的每一段区间,若它消除后剩下的是一堆左括号,则将剩下的那些左括号的哈希值塞进一个std::map中,然后将所有括号取反并翻转序列,重新做如上操作并将哈希值塞进另一个std::map中,这样就分别求得了“留下来的是左括号的序列的哈希值”和“留下来的是右括号的序列所能匹配的左括号序列的哈希值”,将它们贪心地匹配即可。

问题在于如何求得这些区间消除后的哈希值:从左往右依次考虑每个括号并维护一个栈,如果遇到一个左括号则将它入栈,否则如果它与栈顶匹配,则消除,否则清空栈。

当考虑完第 个括号时,处理右端点为 的询问,设其左端点为 : - 如果左端点在某对匹配的括号内部,则该区间消除后的前缀一定是一个右括号(这对匹配的括号中的右括号无法消除),无需处理。 - 否则栈中所有位于该左端点右侧的左括号即为消除完后剩下的左括号序列,计算它的哈希值即可。

总时间复杂度为 ,若用std::unordered_map可以做到线性。

C. Coin

考虑从最后倒推回去,这需要两部分的计算:

  • 操作需要几轮才会结束
  • 操作后的第 个位置在操作前的位置

先考虑第一部分,一次操作会使元素数量减少 ,这是个经典的整除分块形式, 接近 的时候,次数约为 ,暴力模拟无法接受,所以考虑将 相同的段一起处理。

,要找到一个最小的 使得 ,化为不等式处理,即 ,解出 ,所以这段的轮数为

然后考虑第二部分,如果操作一次后在第 个位置,那么对它及前面的每 个元素,都是 个元素删掉一个元素形成的(最后一段可能不足 个元素),因此在它前面的被删掉的元素数为 ,因此它原先是第 个元素。

注意到 的变化次数也是 的,所以同样类似地整除分块处理即可,总时间复杂度

D. Dolls

引理:若一个序列可以被完全合并,则它的任一子区间都可以被完全合并,

根据引理可以得到:若一个区间不可以被完全合并,则所有包含它的区间都不能被完全合并。

因此可以从左往右考虑,每次贪心地合并最长的一段区间,否则不会更优。

给定左端点,二分最大的可能的右端点,问题化为如何检查一个序列是否可以被完全合并。不断合并两个相邻的、紧挨着的套娃,若最后只剩下一个套娃则可以被完全合并(例如, 就是两个紧挨着的套娃,它们合并变为 ),注意这里需要先离散化。

如果每次右端点初始值都设为 ,那么总的时间复杂度为 ,无法承受,我们需要保证二分的长度和为 级别的,这样时间复杂度就降为 ,为此,可以对每个左端点先倍增出第一个不可合并的右端点位置(倍增检查的的区间长度为 ),并将它设为二分的右端点,此时区间长度不超过二倍的最长区间长度,因此二分的长度和不超过 ,总时间复杂度降为

E. Extracting Weights

距离为 的点对至多有 个,将每个看作是一个方程 ,,特别地,初始时给定了方程 ,只需要检验这些方程能否消元得到解。

为此可以一个一个地将方程插入线性基,检验最后是否可以插入 次(初始已经有方程 ),如果可行,就询问线性基中的这 个方程,最后消元求解。总的时间复杂度为

G. GCD

首先,答案一定不会超过 ,证明如下:

假如两个数均为偶数,那么将它们同时除以 ,答案不变。

否则,它们的 是一个奇数,选定 中的一个奇数,将它减去 ,我们就通过至多两次操作将 全部变为了偶数。而 ,因此至多 步就能将 变为 ,此时若 ,则仅需一次操作即可将 变为

因此直接爆搜即可,步骤大于 就剪掉。

H. Horizon Scanning

将所有点极角排序,求相隔 个位置的极角差值的最大值即可,时间复杂度 ,瓶颈在排序。

J. Just another Sorting Problem

  • 如果 ,那么Alice必胜。

  • 否则 ,此时设位置不对的数有

    • ,则谁先手谁获胜
    • 否则,Alice获胜当且仅当 Bob先手,证明就是讨论一下Bob能否使得Alice在每次操作前都维持

L. Last Chance: Threads of Despair

设序列 想要消灭序列 ,先用 中不为 的那些元素攻击 中元素,最后一起爆炸一定最优。

问题在于 中那些不为 的元素应该打谁:考虑将 升序排序,维护当前最后可以连锁爆炸几次、还剩下多少刀可以打,每遇到一个最后解决不了的 中元素就把它打到可以最后炸死的程度,然后让最后的爆炸次数加一。

最后如果剩下一些刀(可以为 )说明答案为Yes,否则为No。时间复杂度 ,瓶颈在排序。

M. Matrix Construction

一种可能的构造方案是沿副对角线方向从小到大填入数字,例如:

证明:考虑相邻两个数一定在相邻的两个副对角线上,如果两对相邻的数()所在的副对角线不同,那么由于处于左上方副对角线的元素一定更小,所以必然有

中的一个成立,于是 自然成立 如果位于相同的副对角线上,由于同一副对角线上元素是单调的,所以也不可能相等。