Educational Codeforces Round 192

Educational Codeforces Round 192

Dashboard - Educational Codeforces Round 192 (Rated for Div. 2) - Codeforces

A:简单结论题,存在 \(c_i\ge3\) 即可组成 \(\texttt{aaa}\) 型,存在 \(c_i\ge2,c_j\ge2\) 即可组成 \(\texttt{abab}\) 型,否则无解。

B. Predominant Frequency Division

给定一个序列 \(a\),其中 \(a_i\in\{1,2,3\}\)。将序列划分成三段,第一段要求 \(1\) 的个数不少于 \(2\)\(3\) 的个数之和,第二段要求 \(1\)\(2\) 的个数之和不少于 \(3\) 的个数,第三段无要求。

问是否有解。\(1\le t\le10^4\)\(\sum n\le2\cdot10^5\)

贪心。首先,第二段只要第一个是 \(1\)\(2\) 就可以了。

从前往后扫,发现某个位置 \(i\) 满足前面 \(1\) 的个数大于等于 \(2\)\(3\) 的个数之和,则一定可以结束第一段

  1. 如果 \(i\) 后面是连续的 \(3\),就将这些 \(3\) 尽量包含到第一段中,让第二段的 \(3\) 尽量少;
  2. 在 1. 的基础上,如果 \(i\) 后面再次碰到 \(1\)\(2\),就直接令这个 \(1\)\(2\) 单独作为第二段;
  3. 在 1. 的基础上,如果 \(i\) 后面连续的 \(3\) 没有完全包含在第一段中,那么也可以结束第一段,用 \(3\) 作为开头开始第二段。因为对于第二段来说 \(1\) 也是有用的,所以不必为了第一段更长而向后继续找 \(1\),否则可能会吞掉对第二段有用的 \(2\)

Submission #381687806 - Codeforces

C. Unstable Elements

给定一个已排序的整数数组 \([a_1, a_2, \cdots, a_n]\)。我们可以对该数组执行任意次数的以下操作类型:

  1. 标记数组的第一个元素,以及所有不等于其左侧相邻元素的元素(即所有满足 \(a_i \neq a_{i - 1}\) 的元素 \(i\))。
  2. 然后删除所有标记元素或复制它们(即,用两个相同的元素替换每个标记元素)。

例如,考虑数组 \([\mathbf{1}, 1, 1, \mathbf{2}, \mathbf{4}, 4, \mathbf{5}]\)(标记元素以粗体显示)。若删除所有标记元素,则得到 \([1, 1, 4]\);若复制这些标记元素,则得到 \([1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5]\)

若数组为空,则无法执行操作。每次操作后,所有元素均会被取消标记。

我们称一个整数数组 \(b\) 为可达的,如果它可以通过若干次所述操作从数组 \(a\) 获得。你的任务是统计长度为 \(k\) 的可达数组的数量。

\(1 \le t \le 10^4\)\(1 \le k, \sum n \le 3 \cdot 10^5\)。保证 \(1 \le a_1 \le a_2 \le \dots \le a_n \le n\)

设标记元素个数为 \(c\),序列长度为 \(s\),元素最小出现次数为 \(m\),则可以通过操作 2 将长度变为 \(s+ic\),其中 \(i\in[-m+1,\infty]\)。(这里不可以把出现最少的元素全部删掉(即令 \(i=-m\)),不然会重复计算。)

因此维护 \(c,s,m\) 之后,只需 check 一下 \(k\) 是否满足条件即可。注意到元素具体是什么其实不重要,因此只需维护出现次数的序列即可(例如样例即是 \([3,1,2,1]\))。

不停地删出现次数最少的数,然后按上述过程累加即可。

Submission #381490970 - Codeforces

D. Two Digit Strings

给定两个由数字组成的字符串 \(a\)\(b\)。每次操作可以从这两个字符串中任选两个相邻的字符,并用它们的和取模 \(10\) 将其替换。(经过一次操作后,字符串的长度减 \(1\) 。)

执行若干此操作,使得 \(a=b\)。计算所得到的最大可能长度。

\(1\le t\le2\cdot10^3\)\(1\le|a|,|b|\le5\cdot10^3\)\(\sum(|a|+|b|)\le10^4\)

设最后将 \(a\)\((la_1,ra_1],(la_2,ra_2],\cdots,(la_k,ra_k]\) 位置分别合并为一个数,其中 \(a\) 的下标从 \(1\) 开始,\(la_1=0,ra_k=|a|\)

则最后的 \(a_i\equiv sa_{ra_i}-sa_{la_i}\pmod{10}\),其中 \(sa\)\(a\) 的前缀和(模 \(10\)),\(i=1,2,\cdots,k\)。同理 \(b_j\equiv sb_{rb_j}-sb_{lb_j}\pmod{10}\)

由于 \(sa_0=sb_0=0\),一定有 \(sa_{ra_1}=sb_{rb_1},sa_{ra_2}=sb_{rb_2},\cdots,sa_{ra_k}=sb_{rb_k}\)

进而问题就变成了,求 \(sa\)\(sb\) 的最长公共子序列 (LCS)。\(O(n^2)\) 解决,其中 \(n\)\(|a|,|b|\) 同阶。

Submission #381504852 - Codeforces

E. Product of Closures

tag: 构造, 二进制, 贪心, 分类讨论

设正整数 \(x > 0\)闭包 (closure) 为如下的无限二进制字符串 \(C(x)\)

  1. \(x\) 表示为不含前导零的二进制形式;
  2. 将得到的字符串自身无限次循环拼接,得到的结果记为 \(C(x)\)

定义两个闭包的乘积(记作 \(C(x)\,\&\,C(y)\))为将字符串 \(C(x)\)\(C(y)\) 进行按位与运算后得到的无限二进制字符串。

例如,对于 \(C(4)\,\&\,C(9)\),我们有:

\[\begin{array}{rl} C(4) & 100100100100100100\cdots \\ \& \ C(9) & 100110011001100110\cdots \\ \hline & 100100000000100100\cdots \end{array} \]

给你三个整数 \(l\)\(r\)\(n\)。请在区间 \([l, r]\) 的所有数字中,寻找两个整数 \(x\)\(y\)(满足 \(l \le x < y \le r\)),使得它们的乘积 \(C(x)\,\&\,C(y)\)字典序最小,并输出该乘积的前 \(n\) 个二进制字符。

\(1\le t\le1000\)\(1\le l<r<2^{30}\)\(1\le n\le1000\)

首先,如果 \(l\)\(r\) 的二进制位数相同,贪心构造,从高位到低位枚举,如果碰到第 \(i\) 位既可以为 \(0\) 又可以为 \(1\),就令 \(l\) 的第 \(i\) 位及以下为 \(2^i\),令 \(r\) 的第 \(i\) 位及以下为 \(2^i-1\),这样就完成了构造。

下面考虑 \(l\)\(r\) 的二进制位数不同的情况。

如果 \(l\ll r\),令 \(x=2^{\lfloor\log_2r\rfloor-1}\)\(y=2^{\lfloor\log_2r\rfloor}\),由于 \(\gcd(i,i+1)=1\),循环节为 \(L=\lfloor\log_2r\rfloor\cdot(\lfloor\log_2r\rfloor+1)\),即每 \(L\) 个数字出现一个 \(1\)。这是最理想的情况。

考虑 \(l>2^{\lfloor\log_2r\rfloor-1}\) 的情况,仍然令 \(y=2^{\lfloor\log_2r\rfloor}\),此时 \(l\)\(r\) 少一位,循环节仍然为 \(L=\lfloor\log_2r\rfloor\cdot(\lfloor\log_2r\rfloor+1)\)。可以发现,如果要让第二个 \(y\)\(1\) 变成 \(0\),就要让 \(x\) 的第二位为 \(0\);如果要让第三个 \(y\)\(1\) 变成 \(0\),就要让 \(x\) 的第三位为 \(0\);以此类推。因此,贪心地让 \(x\) 的高位为 \(0\),这就等价于让 \(x\) 最小,即令 \(x=l\)

Submission #383449929 - Codeforces

posted @ 2026-07-19 19:29  f2021ljh  阅读(20)  评论(0)    收藏  举报