Codeforces Round 1123 (Div. 2)

A Turn Into a Palindrome

给定字符串 \(s\) 和字符 \(x\),每次操作可以选定字符串内任意一位替换为 \(x\),求使 \(s\) 成为回文串的最少操作次数。

\(nt\leq 50000\)

考虑每对回文位置的数,若其中一个为 \(x\),必然要把另一个改为 \(x\),若两个都不一样,必然要把两个数均改为 \(x\)

https://codeforces.com/contest/2267/submission/392675494

B Fashionable Array

规定数组 \(a\) 的 \(mode\) 为 \(a\) 的众数中最大的一个。现给定数组 \(b\),请重新排列 \(b\),使得 \(b\) 的所有前缀数组的 \(mode\) 之和最大。

\(nt\leq 50000\) , \(b_i\leq100\)

只考虑最大的数,为了让总和最大化,必须要尽可能最大化最大的数作为 \(mode\) 出现的次数。可以想到如下方法:让最大的数首先出现一次,然后让其他的数各出现一次;随后再考虑剩余数中最大的数,重复上述步骤。容易证明每次考虑的最大的数是单调不增的,该贪心策略正确。

https://codeforces.com/contest/2267/submission/392676233

C GCD Treasury

给定数组 \(a\) 和数 \(x\),规定一次操作为:

选择一个满足 \(a_i>0\) 且 \(\gcd(a_i,x)\neq 1\) 的 \(i\),先将 \(a_i\) 减少 \(\gcd(a_i,x)\),再将 \(x\) 赋值为 \(\gcd(a_i,x)\)

若没有可选的 \(i\),则操作停止。求最大可能减少数量之和。

\(\sum n\leq 3\times 10^5\) , \(1\leq x,a_i\leq 3\times 10^5\)

容易想到对 \(x\) 质因数分解。发现仅有有共同质因数的数能被连续消去。所以考虑按质因数给 \(a_i\) 分组。有公共质因数的数能够被完全消去(证明:设 \(a_i=bp\) , \(x=ap\) , 则 \(a_i\) 可被完全消去且 \(x\) 变为 \(p\),后续均可消去)。比较哪个质因数对应的结果最大即可。

https://codeforces.com/contest/2267/submission/392681698

D Backrooms Hill

规定一个数组是 \(hill\),当且仅当其先严格递增,然后严格递减(只递增不递减或只递减不递增的数组也可以视为 \(hill\))

准确地说,对于长度为 \(m\) 的数列 \(a\),存在 \(1\leq k\leq m\),当 \(1\leq i< k\) 时有 \(a_i<a_{i+1}\) ,且当 \(k\leq i<m\) 时,\(a_i>a_{i+1}\) 时,\(a\) 是一个 \(hill\)

你可以对给定数列 \(a\) 选定一个 \(i\),交换 \(a_i\) 与 \(a_{i+2}\)。问能否在若干次操作后,使得给定数列成为一个 \(hill\)

\(\sum n\leq 2\times 10^5\),保证给定数列是 \(n\) 的一个排列。

做力竭了。

题目里有关于性质的信息,一个是交换的特殊限制,一个是保证为 \(n\) 的排列。

这个排列有一个很好的性质:假设 \(a\) 是 \(hill\),那么 \(a_n,a_{n-1},\dots,a_i\) 必定覆盖从 \(i\) 到 \(n\) 的全部数字(\(1\leq i\leq m\))

证明:假设不符合,那么在 \(a_n,a_{n-1},\dots,a_i\) 中,一定会存在一个小于 \(i\) 的数,位于两个 \([i,n]\) 之间的数,这样会构成一个谷,不符合 \(hill\) 的定义。(特例:当仅有 \(a_i\) 不符合时,对于 \(1\leq j<i\) 的 \(a_j\),必然有一个比 \(a_i\) 大,然而我们有 \(i\leq m\),此时应是单调递增的,因此不符合 \(hill\) 的定义。)

接下来我们来考虑只能交换 \(a_i\) 和 \(a_{i+2}\) 这个限制。这说明奇下标和偶下标是互不连通的。这是本题交换的唯一限制。

综合以上两个条件,可以得出一个方法:从 \(n\) 到 \(1\) 依次判断所在原下标的奇偶性。由于现在我们还不确定 \(m\) 的值,所以也不确定性质一从何处开始生效。因此我们需要找一些新的性质:

  1. 当 \(i=m\) 时,根据性质一与定义,可以得到 \(a_j=j\ (m\leq j\leq n)\),因此,当位于 \(m\) 之前时,必须保证我们从 \(n\) 到 \(1\) 依次判断的过程中,奇下标与偶下标交替出现,也就是二者数量差不超过 \(1\)
  2. 假设性质一是成立的,我们确定 \(m\) 以后,仍然可以视作需要满足 \(a_j=j\ (i\leq j\leq n,\ 1\leq i\leq m)\),实际上这个 \(m\) 并没有造成什么影响

因此按上述做法判断奇下标与偶下标之差即可

https://codeforces.com/contest/2267/submission/392956488

看讨论还有一种纯模拟做法。似乎是贪心+特判一堆情况。本质石山。看似石山实则我一开始就想这么做。

这一篇是 DP 模拟填数的。其实也差不多。核心就是奇偶性。然后从最中间的 \(n\) 开始填。

posted @ 2026-10-02 21:31  HaneDaniko  阅读(36)  评论(0)    收藏  举报