贪心、构造、DP、交互 合集(Part 1)

Problem A. CF1592F1 Alice and Recoloring 1

题意:

给定一个 \(n\)\(m\) 列的目标矩阵,矩阵元素只有 W 或 B ,并且你有一个初始矩阵,元素全为 W 。

现在你可以矩阵实施以下操作:

  1. 使用一块钱,选定一个包含 \((1,1)\) 的子矩阵,把矩阵中的元素全部反转( W 变 B , B 变 W )。
  2. 使用两块钱,选定一个包含 \((n,1)\) 的子矩阵,把矩阵中的元素全部反转。
  3. 使用四块钱,选定一个包含 \((1,m)\) 的子矩阵,把矩阵中的元素全部反转。
  4. 使用三块钱,选定一个包含 \((n,m)\) 的子矩阵,把矩阵中的元素全部反转。

现在需要你求出把初始矩阵变为目标矩阵最少需要几块钱。

\(1 \leq n, m \leq 500\)

解法:

简单题。

根据对于构造与贪心的问题的一般思考方式,考虑将操作简化。容易发现以左下和右上为起点的矩形花费太大,完全没有用,但是右下角为起点的矩形可能有用。

不过进一步地,容易发现每一次对右下角矩形操作可以转为 \(4\) 次对左上矩形的操作,并且其中有一个操作是将整个矩形翻转。如果最优操作中有偶数次对右下角翻转,那么对整个矩形的翻转就被消去了,可以用左上替代。

更进一步,发现右下矩形操作次数就算是奇数,也可以将右下矩形操作变为只有 \(1\) 次。故存在方案使得只有至多一次右下矩形的操作,其余都是左上矩形的操作。

如果想到差分就做完了,想不到的可以考虑每个 \(0\)\(1\) 相当于限制了这个点右下角的操作次数的奇偶性,对于每个点和右边点异或就能得到这一列的一段后缀的结果。将每一列这样的相邻不同数量求和即可。对于唯一一次右下操作,枚举位置并简单算下贡献就可以做到 \(O(n^2)\)

Submission Link.

Problem B. CF1592F2 Alice and Recoloring 2

题意:

给定一个 \(n\)\(m\) 列的目标矩阵,矩阵元素只有 W 或 B ,并且你有一个初始矩阵,元素全为 W 。

现在你可以矩阵实施以下操作:

使用一块钱,选定一个包含 \((1,1)\) 的子矩阵,把矩阵中的元素全部反转( W 变 B , B 变 W )。

使用三块钱,选定一个包含 \((n,1)\) 的子矩阵,把矩阵中的元素全部反转。

使用四块钱,选定一个包含 \((1,m)\) 的子矩阵,把矩阵中的元素全部反转。

使用两块钱,选定一个包含 \((n,m)\) 的子矩阵,把矩阵中的元素全部反转。

现在需要你求出把初始矩阵变为目标矩阵最少需要几块钱。

\(1 \leq n, m \leq 500\)

解法:

虽然题意与 F1 不同,但是 F1 的做法能给予我们很明确的思考方向。比较容易注意到仍然只有左上和右下操作有效,但是可能存在大量右下操作都是有效的。不过还是可以从一些特殊情况入手。

首先可以发现右下操作如果顶到了左边界或上边界,那么可以直接被左上操作替代。同时可以发现不可能存在两次的右下操作互相包含且存在某条边重合。

其次,考虑差分数组 \(c_{i,j} = b_{i,j} \oplus b_{i+1,j} \oplus b_{i,j+1} \oplus b_{i+1,j+1}\),发现左上操作是差分数组的单点取反,右下操作是将包含 \((n,m)\) 在内的四个位置单点取反。目标是将除了 \((n,m)\) 之外的点的差分值改为 \(0\)\((n,m)\)\(1\)

进一步,考察什么样的右下操作有意义。事实上当且仅当除了 \((n,m)\) 的余下 \(3\) 个取反的位置都是 \(1\) 时才会进行操作。否则可以直接改为左上操作。

根据这样的条件,建立二分图,左侧 \(n-1\) 个点,右侧 \(m-1\) 个点。在 \((i,j)\) 进行右下操作优,就将 \((i-1,j-1)\) 连边。在二分图上跑最大匹配,剩下的还没被改的点只能用左上,直接计算即可。

如果使用朴素的最大匹配做法复杂度为 \(O(n^3)\),使用 Dinic 可以做到 \(O(n^{2.5})\),均可通过。

Submission Link.

Problem C. CF1622F Quadratic Set

题意:

给定 \(n\),在 \(1!,2!,3!,\cdots,n!\) 选尽量多的数,使得乘积是完全平方数。

\(n \leq 10^6\)

解法:

看着没有什么思路。对于这类最优化问题,可以考虑答案的某个界。比如这个题,考虑答案下界为多少。这个界与 \(n\) 之差不应太大,否则没有什么意义。如果打表可以发现答案不小于 \(n-3\)。为什么呢?

考虑 \(n\) 为偶数的情况。若 \(n\) 为奇数则钦定 \(n!\) 不选。令 \(n=2k\),此时可以发现如果全选,即最终结果为 \(\prod \limits_{i=1}^n i!\),考虑 \(i!(i+1)!\),将所有出现过偶数次的那些忽略,这玩意最终剩下了 \(i+1\),所以最终这个结果变成了 \(2 \times 4 \times 6 \times \cdots \times (2k)!\),这个等于 \(2^k \times k!\),现在把 \(2!\)\(k!\) 都删掉,可以发现总是完全平方数。

于是我们只需要判断答案为 \(n\)\(n-1\)\(n-2\)。这个做法是考虑异或哈希,对于质因数随机哈希权值,然后三个都是容易判断的。

Submission Link.

Problem D. CF1768F Wonderful Jump

题意:

给定整数 \(n\) 和长度为 \(n\) 的序列 \(a\)

从位置 \(i\) 跳到位置 \(j(1\leq i\leq j\leq n)\) 需要花费 \(\min(a_i,a_{i+1},\cdots,a_j)\times(j-i)^2\) 枚金币。
对于 \(k=1,2,\cdots,n\),求出从位置 \(1\) 经若干次跳跃后跳到位置 \(k\) 需要的最小金币总数。

\(n \leq 4 \times 10^5\)\(1 \leq a_i \leq n\)\(4\) 秒。

解法:

首先有一个显然的 DP,即 \(f_i\)\(1\)\(i\) 的答案,转移显然,但复杂度错误。

考虑这个 DP 肯定还是要的,但是要分析一些性质优化转移。

首先发现 \(a_i\)\(a_j\) 必然是区间最小值,否则可以从最小值位置分成两部分,显然结果不会更大。

其次,有一种方案容易计算结果,就是一个个跳,此时结果为 \(\sum \limits_{i=1}^{n-1} \min\{a_i,a_{i+1}\}\),放缩一下不超过 \(n\times len\)。而如果直接走,结果为 \((len-1)^2 \times mn\),其中 \(mn\) 为最小值。则有 \((len-1)^2mn\leq nlen\),进一步可以得到 \(len \times mn \leq n\)。于是令 \(B=\sqrt{n}\),对于 \(len \leq B\) 直接转移,\(len > B\) 时有 \(mn \leq B\),此时分类讨论 \(i\)\(j\) 哪个是最小值并分别向前向后转移即可。复杂度 \(O(n \sqrt{n})\)

Submission Link.

Problem E. CF1658F Juju and Binary String

题意:

给定 \(n,m\) 和一个长度为 \(n\)\(01\) 字符串。你需要选出尽量少的不重叠的子段,使得子段长度之和为 \(m\),且子段中的 \(01\) 占比和原串相同。有解输出构造,无解输出 \(-1\)

\(1 \leq m \leq n \leq 2 \times 10^5\)

解法:

令原串中有 \(c\)\(0\),有解的必要条件是 \(\dfrac{cm}{n}\) 为整数。

这里我们给出一个关于答案上界的结论。若有解,答案必然不超过 \(2\)

如果注意力比较集中,可以发现如果我们把序列复制一份到后面形成环,那么必然有一个子区间的 \(0\) 的个数是我们希望得到的。因为每个长度为 \(m\) 的子区间的 \(0\) 占比不可能总小于或大于整串。而同时每次滑动到下一个子区间,\(0\) 的数量变化绝对值不超过 \(1\),于是必然有这样的一个区间。这样的区间要么是序列一段,要么是前缀加后缀,所以答案不超过 \(2\),直接判断就好。

Submission Link.

Problem F. CF1765G Guess the String

题意:

本题是交互题。

有一个长度为 \(n\) 的未知 \(01\) 字符串,你只知道字符串第一个字符位 \(0\)。你需要在 \(789\) 次询问内将其猜出。定义函数 \(p(i)\)\(q(i)\) 分别是最大的 \(j<i\) 满足 \([1,i]\) 长度为 \(j\) 的前后缀相同,以及前后缀逐位比较都不同。你每次可以询问任意一个位置的 \(p\)\(q\)

交互库不自适应。

解法:

外星人智慧题。

\(n-1\) 次询问内猜出太容易了。直接增量询问就行。但是 \(789\) 的上界和不自适应的交互库有点神秘。

注意到 \(789\) 大概是 \(\dfrac{3}{4}n\) 量级的东西,那么有一个思路是每 \(4\) 个分一组并且只问 \(3\) 次,但是你发现这很难做到确定性。考虑两个分一组,只问后面的那个的值。这样如果结果 \(\geq 2\),可以省去一次询问,如果结果为 \(0\)\(1\),根据 \(s_2\)\(s_{2k}\) 的关系也有可能减少一次询问。但是仔细发现询问 \(p\)\(q\) 时,\(s_2\)\(s_{2k}\) 的关系要求是相反的,如果每次随机选择询问 \(p\)\(q\),有期望 \(\dfrac{1}{4}n\) 个询问被省略,所以最终询问次数期望 \(\dfrac{3}{4}n\),可以通过。

Submission Link.

Problem G. CF1381C Mastermind

题意:

给定一个长度为 \(n\) 的每个数在 \([1,n+1]\) 内的整数序列 \(a_1,a_2,\cdots,a_{n}\) 和两个整数 \(x,y\)。试构造一个长度为 \(n\) 的整数序列 \(b\),满足 \(b\) 的每个数也在 \([1,n+1]\) 中,且恰有 \(x\) 个位置与 \(a\) 对应相同,若将 \(a\)\(b\) 看作可重集,那么两个可重集的交集大小为 \(y\)。有解输出构造,无解输出 \(-1\)

\(n \leq 10^5\)\(0 \leq x \leq y \leq n\)\(1\) 秒。

解法:

比较显然的想法是,我们应该先找到 \(x\) 个位置相同,然后考虑剩下的位置。需要使得对应位不同且恰好有 \(y-x\) 个相同部分。但是范围很奇怪啊!值域是 \(n+1\) 而不是 \(n\),也就是说总存在某个数在 \(a\) 中没出现过!如果我们能使得后面部分在对应项不同的情况下交集尽量大,那么只要最大值不小于 \(y-x\),就可以把若干数换成那个 \(a\) 中没有的。

现在问题转化为,我们需要选定前面的数,使得后面部分能得到的交集最大。这是经典结论,如果后面的出现次数最大值不超过一半,则交集可以为后面全部,否则可以简单贪心。二分后面部分出现次数的最大值即可。

Submission Link.

Problem H. CF1906B Button Pressing

题意:

给出两个长为 \(n\)\(\texttt{01}\)\(a_n,b_n\),问是否可以通过对 \(a\) 执行若干次操作得到 \(b\)。每次操作选择一个数 \(i\) 满足 \(a_i=1\),并将 \(a_{i-1}\)(若存在)和 \(a_{i+1}\)(若存在)的 0/1 状态翻转。

\(3 \leq n \leq 2 \times 10^5\)

解法:

Adhoc 大神啊。

考虑这个东西不好刻画。对于这类不好刻画的,经常考虑形如差分,或前缀后缀之类的东西。考虑 \(a\) 的前缀异或和序列 \(s_1,\cdots,s_n\),发现对于所有 \(i>1\) 的操作,相当于要求 \(s_i\)\(s_{i-1}\) 不同,然后交换。对于 \(i=1\) 的操作,会将 \(s_2,\cdots,s_n\) 全部取反。那么容易发现,令 \(a\) 前缀异或和有 \(c\)\(1\)\(b\) 前缀异或和有 \(d\)\(1\)。只需要满足 \(c=d\)\(d=n-c+1\) 即可。复杂度线性。

其实但凡想到前缀异或就做完了,但是对着原序列想就太困难了。

Submission Link.

Problem I. CF1198F GCD Groups 2

题意:

给定 \(n\) 个数,将 \(n\) 个数分为两组,使每组的 \(\gcd=1\)。输出分组方案或无解信息。

\(n \leq 10^5\)\(1 \leq a_i \leq 10^9\),时限 \(500\) 毫秒。

解法:

奇妙随机化。

首先的显然想法是大概率有解,且解数量应该很多。

容易发现一个数出现次数 \(>2\) 则没意义,将每个数至多保留两次即可,多出来的数随便给任意一个集合即可。

考虑一个奇妙做法是,先将序列随机打乱,每次给每个数随机分配进一个集合,然后判定。这样甚至可以通过。不过更好的做法是每次将序列随机打乱,取一段最短的 \(\gcd=1\) 的前缀。这也是可以通过的。

Submission Link.

Problem J. P11189 「KDOI-10」水杯降温

洛谷 2024 S 组模拟赛 T2。

题意:

给定一棵 \(n\) 个点的有点权的有根树,点权为 \(a_1,a_2,\cdots,a_n\),根为 \(1\),问能否通过若干次下列操作将所有点权变为 \(0\),每次操作可以选择:

  1. 选择一个点,将其子树每个点点权加 \(1\)
  2. 选择一个叶子,将叶子到根路径上每个点点权减 \(1\)

你只需要判断是否可行,不需要输出构造。

\(2 \leq n \leq 10^5\)\(-10^{12} \leq a_i \leq 10^{12}\)

解法:

很 CNOI 的题。

对于一些难以刻画的操作,将其差分往往是一个很好的方案。考虑树上差分,令 \(b_u = a_u - a_{fa_u}\),目标是所有 \(b\) 都变为 \(0\)。下文称点权都为差分数组的权值。

操作 \(1\) 是选一个点,将其点权加上 \(1\)。操作 \(2\) 则是选一个叶子,将所有不在叶子到根路径上但离叶子到根路径距离为 \(1\) 的点加上 \(1\),然后让根减去 \(1\)

注意到除了根之外,每个点的点权都只增不减,所以若存在 \(2 \leq u \leq n\)\(b_u>0\),必然无解。其次,若 \(b_1\leq 0\),必然有解,这个时候所有点都可以用操作 \(1\) 完成。

否则,\(b_1 > 0\)。此时我们只能通过操作叶子来减少根的权值。考虑 DP,记 \(f_u\) 表示在 \(u\) 子树内最多进行多少次操作 \(2\)。转移时进行二分,对于每个儿子子树有一个操作次数的区间限制,判定是容易的,总复杂度 \(O(n \log V)\),可以通过。

Submission Link.

Problem K. P10220 [省选联考 2024] 迷宫守卫

送走我省选的题 /ll。

题意:

Alice 拥有一座迷宫,这座迷宫可以抽象成一棵拥有 \(2^n\) 个叶节点的满二叉树,总节点数目为 \((2^{n+1} - 1)\),依次编号为 \(1 \sim (2^{n+1} - 1)\)。其中编号为 \(2^n \sim (2^{n+1} - 1)\) 的是叶节点,编号为 \(1 \sim (2^n - 1)\) 的是非叶节点,且非叶节点 \(1 \le u \le (2^n - 1)\) 的左儿子编号为 \(2u\),右儿子编号为 \((2u + 1)\)

每个非叶节点都有一个石像守卫,初始时,所有石像守卫均在沉睡。唤醒 \(u\) 点的石像守卫需要 \(w_u\) 的魔力值。

每个叶节点都有一个符文,\(v\) 点的符文记作 \(q_v\)保证 \(q_{2^n}, q_{2^n+1},\cdots, q_{2^{n+1}-1}\) 构成 \(1 \sim 2^n\) 的排列

探险者初始时持有空序列 \(Q\),从节点 \(1\) 出发,按照如下规则行动:

  • 到达叶节点 \(v\) 时,将 \(v\) 点的符文 \(q_v\) 添加到序列 \(Q\) 的末尾,然后返回父节点。
  • 到达非叶节点 \(u\) 时:
    • 若该点的石像守卫已被唤醒,则只能先前往左儿子,(从左儿子返回后)再前往右儿子,(从右儿子返回后)最后返回父节点。
    • 若该点的石像守卫在沉睡,可以在以下二者中任选其一:
      • 先前往左儿子,再前往右儿子,最后返回父节点。
      • 先前往右儿子,再前往左儿子,最后返回父节点。

返回节点 \(1\) 时,探险结束。可以证明,探险者一定访问每个叶节点各一次,故此时 \(Q\) 的长度为 \(2^n\)

探险者 Bob 准备进入迷宫,他希望探险结束时的 \(Q\) 的字典序越小越好,与之相对,Alice 希望 \(Q\) 的字典序越大越好。

在 Bob 出发之前,Alice 可以选择一些魔力值花费之和不超过 \(K\) 的石像守卫,并唤醒它们。Bob 出发时,他能够知道 Alice 唤醒了哪些神像。若双方都采取最优策略,求序列 \(Q\) 的最终取值。

\(1 \leq T \leq 100\)\(1 \leq n \leq 16\)\(1 \leq \sum 2^n \leq 10^5\)\(0 \leq K \leq 10^{12}\)\(0 \leq w_u \leq 10^{12}\)

解法:

我们先来考虑如果先手已经选择完了,后手的最优策略是什么。从根开始 DFS,对于唤醒的点,先往左后往右。对于未唤醒的,往左右先分别递归,然后取结果第一个值较小的那一侧走即可。

现在考虑先手如何选择唤醒的节点。因为需要字典序尽量大,我们不妨考虑如何确定答案的第一位。先进行一个 DP,记 \(f_{u,i}\) 表示在 \(u\) 子树内唤醒节点,使得 \(u\) 子树内后手能走到的第一位最小值大于等于 \(i\) 需要的最小花费。这里只需要考虑 \(i\)\(u\) 子树内叶子的权值,所以状态数量是对的。这样容易知道第一位的答案即为最大的 \(i\) 使得 \(f_{1,i} \leq K\)。然后考虑我们已知后手第一步就走到了 \(i\),那么下一步就是 \(i\) 的邻居,然后是 \(i\) 的父亲邻居子树,依次类推。发现我们事实上可以通过一个 DFS 刻画这个东西。具体来说,DFS 传入参数 \(u,k\) 表示在 \(u\) 子树内,至多花费 \(k\),最终的序列。先找到最大的 \(i\) 使得 \(f_{u,i} \leq k\),根据 \(i\)\(u\) 的左右子树内分类讨论就可以递归下去。复杂度 \(O(2^nn^2)\),可以通过。

Problem L. CF1567F One-Four Overload

题意:

有一个 \(n \times m\) 的网格,每个格子初始都有染色或未染色的状态。你需要给所有未染色的点选择权值 \(1\)\(4\),使得任意染色点的四连通未染色点的权值和为 \(5\) 的倍数。输出构造或报告无解。保证网格最外圈全都未染色。

\(1 \leq n, m \leq 500\)

解法:

首先可以观察到有解的必要条件是每个染色点周围四个点中有偶数个未染色点。

考虑这其实是一个二分图状物,对于旁边有 \(2\) 个未染色点的,直接连边,否则对于 \(4\) 个的,将上面和左边,下面和右边连边。注意力敏锐可以发现上面的必要条件其实是充要条件,且如果这么建图,确实不存在奇环,证明并不显然,我也不会。

Submission Link.

Problem M. P3750 [六省联考 2017] 分手是祝愿

时空将你我分开。

题意:

给定一个长度为 \(n\)\(01\) 序列和整数 \(k\)。每次操作选择一个值 \(1\leq i \leq n\),将 \(i\) 的所有因数的 \(01\) 状态反转,终止状态为所有数都为 \(0\)。问使用如下策略操作,期望操作次数乘以 \(n!\)\(100003\) 取模的结果是多少。策略为,每一次操作前,如果目前局面的最优操作步数不超过 \(k\),则使用最优操作策略,否则在 \([1,n]\) 中等概率均匀随机选择操作的 \(i\)

\(1 \leq n \leq 10^5\)\(0 \leq k \leq n\)

解法:

考虑对于 \(01\) 序列如何计算最优操作步数。显然是从后往前依次操作每个目前还是 \(1\) 的,并将其因数都反转,复杂度 \(O(n \log n)\)

如果最优步数小于等于 \(k\),显然直接输出最优步数。

否则,我们考虑令 \(b_1,b_2,\cdots,b_n\) 表示最优策略下每个位置是否要被操作。容易发现每次操作都是反转 \(b\) 的某一位,且期望步数只与 \(b\)\(1\) 的数量有关,与具体形态无关。于是可以进行一个 DP。记 \(f_i\) 表示目前最小操作次数为 \(i\),期望多少步使得最小步数为 \(i-1\)。有边界 \(f_n=1\)。转移很容易,有 \(f_i = \dfrac{i}{n}+\dfrac{n-i}{n}(f_i+f_{i+1}+1)\)。将 \(f_i\) 提取出来后就可以直接求出了,总复杂度 \(O(n \log n)\)

Submission Link.

Problem N. CF1969F Card Pairing

好题难得。

题意:

给定一副有 \(n\) 张牌的牌组和常数 \(k\),每张牌有花色 \(a_i\),其中满足 \(1 \leq a_i \leq k\)。我们认为牌堆的顺序从上到下就是 \(a_1,a_2,\cdots,a_n\)

现在进行如下游戏:

  1. 游戏开始前,你先摸 \(k\) 张牌。
  2. 每回合,如果手牌为空,则游戏结束。否则你必须弃置手牌中的两张牌,如果他们同花色,你回复一点体力。弃牌后,你模两张牌,然后继续下一个回合。

求出最大的你能恢复的体力数。

\(2 \leq k \leq n \leq 1000\)\(1 \leq a_i \leq k\)

解法:

首先要注意一些性质。

容易发现弃牌时,如果手里有同花色的牌,弃置他们肯定不劣,并且弃哪一花色没有影响。真正需要决策的回合只是那些手牌中目前所有花色牌恰好出现 \(1\) 次。此时你要选择弃置某两张牌,我们称这样的回合为决策回合。

基于这个可以设计 DP。记 \(f_i\) 表示现在已经将 \([1,i]\) 中所有牌摸完,目前手牌中每种花色都恰好出现一次,在后续的回合中能恢复的最大体力。转移枚举弃置的两张牌并模拟到下一个所有牌都出现一次的回合。复杂度 \(O(n^4)\),无法通过。

但事实上,我们考虑弃置花色为 \(x,y\) 的牌,要么之后永远都不会到达决策回合,要么到达某个决策回合,从那个回合转移。考虑到达的决策回合是什么。不妨考虑记 \(p_1,p_2,\cdots,p_k\) 表示目前每种花色的牌是否在手牌中。初始有 \(p_x=p_y=0\)\(\forall 1\leq i \leq k \land i \neq x \land i \neq y, p_i = 1\)。每次摸的两张牌 \(a,b\),其实是将 \(p_a\)\(p_b\) 取反。决策回合则是 \(\forall 1 \leq i \leq k, p_i = 1\)。事实上我们可以假设初始时 \(p\) 全为空,某次抽牌后,如果仅有 \(p_x=p_y=1\),则 \((x,y)\) 的对应决策回合就是这个回合。

那么不然发现之后到达的决策回合的本质不同 \((x,y)\) 个数是 \(O(n)\) 量级的,直接模拟可计算这部分的答案。

对于那种永远不到决策回合的,相当于补图边权最值,直接暴力枚举就行。复杂度 \(O(n^2 \log n)\)\(O(n^2)\),具体依赖于实现。

Submission Link.

Problem O. CF1876E Ball-Stackable

题意:

给你一棵 \(n\) 个点的树,其中有一些边方向给定,剩下的边由你来决定方向。同时你要给每条边染一个颜色。

现在有一个人在树上走,他有一个栈,当他经过一条边时会进行如下操作:

  • 如果他走的方向与边的方向相同,往栈里放一个与该边颜色相同的球。
  • 如果他走的方向与边的方向相反,从栈顶取出一个球丢掉。

一个路径合法当且仅当每次走相反的边之前栈都不为空。

你构造的方案要满足对于任意合法路径,每次走反向边时取出的球都恰好与该边颜色相同。在此基础上使边的颜色数最多,并输出方案,无解输出 \(-1\)

\(n \leq 10^5\)

解法:

首先不可能无解,因为将所有边染成同一种颜色即可。

其次,考虑特殊情况,如果所有边都未定向会发什么什么。此时选一个点为根生成外向树必然是不劣的,每条边都能赋一种新颜色。

于是我们猜测就算有些边定向,仍然存在一种最优方案,使得这个方案是以某个点为根的外向树。此时颜色数就是以这个点为根的未定向或外向的边数。

但是你发现这样似乎不能构造,如果某条这个点开始的链反向边更多,无法分配权值。但是事实上如果真的有这样的路径,我们可以将起点往路径上移动并且权值不劣,所以就做完了。

Submission Link.

Problem P. CF1819D Misha and Apples

题意:

给定 \(n\) 个集合 \(S_i\),第 \(i\) 个集合的大小为 \(k_i\),集合元素为 \(1\sim m\) 的正整数。特别地,若 \(k_i = 0\),则 \(S_i\) 可以是正整数 \(1\sim m\) 的任意可空子集,由你确定

可重集 \(S\),初始为空。按编号从小到大依次遍历每个集合,往 \(S\) 中加入 \(S_i\) 所有元素。每次加入当前集合的所有元素后,若 \(S\) 包含重复元素,则清空 \(S\)。注意,一个集合内的元素 同时 被加入 \(S\)

你需要确定 \(k_i = 0\)\(S_i\) 具体包含哪些数,使得最终的 \(|S|\) 最大。求出这个最大值。

多组数据。

\(1\leq T, \sum n, m\leq 2\times 10 ^ 5\)\(0\leq \sum k_i\leq 2\times 10 ^ 5\)\(S_i\) 的元素互不相同。

注意不保证 \(\sum m\) 的数量级。

解法:

简单题。

如果我们将操作中每次清空进行分段,容易发现我们只关心最后一段加入的元素数量。

我们不妨枚举在哪次操作是最后的一次清空操作,这意味着之后的集合中每个数出现次数不超过 \(1\)。此时如果后面有自选集合,答案为 \(m\),否则答案为后面集合不交并大小。但是我们还需要判定每个位置是否能成为最后的清空操作。考虑 DP。记 \(f_i\) 表示能否在第 \(i\) 次操作结束后恰好清空集合。对于自选集合,必有 \(f_i=1\),否则考虑通集合内某个数过来,进一步发现只需要维护一段区间内是否存在 \(f\)\(1\),直接使用 set 维护所有 \(f_i=1\)\(i\),查询直接二分即可。复杂度 \(O(n \log n)\)

Submission Link.

Problem Q. [AGC028E] High Elements

题意:

题目描述:你有一个\(1,2,\dots,n\) 的排列 \(P\)。设一个长度为 \(n\)\(01\) 字符串 \(S\) 合法,当且仅当,先设两个空序列 \(A,B\),我们按照 \(1\)\(n\) 的顺序,若 \(S\) 当前位为 \(1\) 则把当前位的 \(P\) 添加到序列 \(A\) 的末尾,否则添加到序列 \(B\) 的末尾,使得 \(A,B\) 的前缀最大值个数相等。求字典序最小的合法字符串 \(S\) 或报告无解。

\(1 \leq n\le 2\times 10^5\)

解法:

我们要求字典序最小的答案,不妨考虑按位贪心。

先观察有解的性质。

如果有解,则必然存在一组构造使得有某个序列的前缀最大值全都是整个排列的前缀最大值。

证明:

考虑若两个序列都存在某个非全局前缀最大值,我们必然可以分别选择两个非全局前缀最大值交换。

不妨考虑我们已经钦定了排列中 \([1,i]\) 这些位置的分配方式,考虑令 \(c_A\) 表示 \(A\) 序列目前的前缀最大值数,\(c_B\) 同理。记 \(s\)\([i+1,n]\) 中全局前缀最大值数。

我们不妨假设 \(A\) 序列在 \([i+1,n]\) 中选的数的前缀最大值全都是全局前缀最大值。设 \(k\)\(B\) 序列在后面选的全局前缀最大值数量,设 \(m\)\(B\) 序列在后面选择的非全局最大值,但是为 \(B\) 的前缀最大值数。则显然有 \(c_A+s-k=c_B+k+m\),移项得 \(2k+m=c_A+s-c_B\)。后面是常量,设其为 \(r\),则必要条件为 \(m \equiv r \pmod 2\)。但是我们可以发现 \(k\) 的限制只有 \(\geq 0\),所以如果满足必要条件且满足 \(2k + m \geq r\) 即可。则这两个条件同时满足即为后面存在合法分配方案的充要条件。

接下来的事情就比较自然了。考虑有解的充分必要条件其实就是在后面选一个初始值大于等于某常数的上升子序列,令前缀最大值的点权值为 \(2\),其余点为 \(1\),则要求找到一个最大带权 LIS,这个直接线段树优化 DP,在按位贪心的时候逐步撤销即可。复杂度 \(O(n \log n)\),别忘了上文假设了 \(A\) 序列前缀最大值位置都是全局的,对 \(B\) 也要判断一次。

Submission Link.

Problem R. CF718E Matvey's Birthday

题意:

给定一个仅包含 ah 的字符串,下标从 \(0\) 开始。

有一个 \(n\) 个结点的无向图,点的编号为 \(0\)\(n-1\),边权都为 \(1\)。结点 \(i\) 与结点 \(j\) 间有边相连当且仅当 \(|i-j|=1\)\(S_i=S_j\)

求这个无向图的直径和有多少对点间的最短距离与直径相同。

直径定义为任意两点之间最短路的最大值。

\(2 \leq n \leq 10^5\),时限 \(2\) 秒,空间限制 \(256\) MB。

解法:

很好的性质观察题,完全无法独立思考。

我们不妨先考虑两点之间的最短路怎么刻画。对于点 \(i\)\(j\),我们希望求出 \(i\)\(j\) 的最短路。不难发现如果将最短路的点对应字符写下,不可能出现某种字符出现次数大于等于 \(3\) 次,否则这就不是最短路了。更进一步,最短路不超过 \(15\)

我们首先求出 \(f_{i,j}\) 表示从 \(i\) 号点出发,到达某个字符为 \(j\) 的点的最短距离。这个可以对每种字符做多起点 BFS,这部分复杂度 \(O(n \left| \Sigma \right|^2)\)。然后我们考虑处理出 \(g_{i,j}\) 表示某个字符为 \(i\) 的点到某个字符为 \(j\) 的点的最短路最小值。这个直接通过 \(f\) 就可求出。

现在我们其实已经可以求出点 \(i\)\(j\) 的最短路了。\(dis(i,j)=\min(|i-j|,\min \limits_{k=1}^8 f_{i,k}+f_{j,k}+1)\)。两部分分别表示只经过相邻两点的边,或者从某个字符中转。

这样我们得到了一个 \(O(n^2|\Sigma|)\) 的做法,直接枚举 \(i,j\) 即可。这个做法复杂度瓶颈在于两点之间最短路和其 \(f\) 值有关,不容易直接处理。

做到这里有些困难了,比较考察注意力。注意到对于 \(i,j\),必有 \(g_{a_i,j} \leq f_{i,j} \leq g_{a_i,j}+1\)。然后对于一个 \(i\),所有 \((a_j,S)\) 相同的 \(j\) 一起计算,\(S\) 为一个长度为 \(8\) 的二进制数,表示 \(f_{j,x}\) 的每个取值是 \(g_{a_j,x}\) 还是 \(g_{a_j,x}+1\)。对于 \(|i-j| \leq 15\)\(j\) 重新计算。这样复杂度为 \(O(n|\Sigma|^22^{|\Sigma|})\),事实上状态完全跑不满,可以轻松通过。

Submission Link.

Problem S. CF1062F Upgrading Cities

题意:

给定一张 \(n\) 个点 \(m\) 条边的不保证弱联通的有向无环图。定义 \(g_i\) 表示有多少点 \(j \neq i\),使得 DAG 上 \(j\) 能到 \(i\)\(i\) 能到 \(j\)。你需要求有多少点 \(i\) 满足 \(g_i \geq n - 2\)

\(2 \leq n \leq 3 \times 10^5\)\(1 \leq m \leq 3 \times 10^5\)

解法:

直接使用 bitset 可以做到 \(O(\dfrac{nm}{w})\),不能通过。

下文我们假设图弱联通,即将有向边改为无向边后图联通。非弱联通图是好做的。

我们考虑对于点 \(i\),求出 \(f_i\) 表示有多少个点能从 \(i\) 出发到达,或者我们确定点 \(i\) 不合法。我们只需要对正反两个图分别做一次就行。

现在我们考虑拓扑排序,不妨在每个点 \(i\) 出队列时统计结果。令 \(i\) 出队列后队列集合为 \(Q\)。不难注意到 \(Q\) 中所有点与 \(i\) 没有路径,即这些点与 \(i\) 是独立的。若 \(|Q|=0\),则没有进入过队列的所有点都能从 \(i\) 出发到达。若 \(|Q| \geq 2\),则必然至少有两个点与 \(i\) 独立,我们确定点 \(i\) 不能成为答案。现在考虑 \(|Q|=1\),令目前那个唯一在 \(Q\) 中的点为 \(v\)。则可以注意到要么点 \(i\) 能到达未入队的所有点,要么不能成为答案。判定条件是若存在 \(v\) 的一个出点 \(z\),使得拓扑排序到现在 \(z\) 的入度为 \(1\)。证明考虑若存在这样的点 \(z\)\(i\) 必然不能到达 \(z\),同时 \(z\) 也不能到达 \(i\),否则后面每个点对于 \(i,v\) 的连通性相同。复杂度 \(O(n+m)\)

Submission Link.

Problem T. CF1033E Hidden Bipartite Graph

题意:

交互。

有一个 \(n\) 个点 \(m\) 条边的无向简单联通图,你不知道除了 \(n\) 外的任何其他信息,每次询问选择一个点集 \(S\),交互库返回有多少条边的两端都在 \(S\) 内,你需要在至多 \(2 \times 10^4\) 次询问内判定图是否为二分图。如果是,你需要求出黑白染色结果,若不是,你需要求出图的一个奇环。交互库可能自适应。

\(1 \leq n \leq 600\)\(0 \leq m \leq \dfrac{n(n-1)}{2}\)

解法:

不可能将整个图的形态求出。

但是对于图上的这类问题,常见做法是能不能考虑 DFS 生成树。

事实上,我们可以在 \(O(n \log n)\) 次询问内求出图的一棵 DFS 生成树。具体地,维护目前未被访问过的点集,每次往下 DFS 时二分找到集合中第一个和其有边的点即可。

然后对树进行黑白染色,考虑询问黑白内部是否有边即可判定是否为二分图。若不是,容易直接求出同色的一条边,在树上选这条边的端点对应路径就找到了一个奇环。

范围很松,我的实现最坏询问次数不超过 \(12000\)

Submission Link.

Problem U. CF1081F Tricky Interactor

题意:

这是一道交互题。

有一个长度为 \(n\)\(01\) 序列,初始时 \(1\) 的个数为 \(t\)。定义一次操作为给定 \(l, r(l \le r)\),交互库会等概率地从区间 \([1, r]\)\([l, n]\) 中选择一个,然后翻转下标在该区间内的数(翻转即 \(x \to 1 - x\)),并告诉你翻转完的序列中有多少个 \(1\)。操作之间不是独立的,即对序列的修改是永久的。

你需要在 \(10000\) 次操作内得出原始的序列。

\(n \le 300\)

解法:

对于 \(n\) 分奇偶讨论。

\(n\) 为偶数时,直接考虑依次求出每个位置的值。发现对 \([i,i]\) 连续操作两次,结果要么和原序列相同,要么除了 \(i\) 其他位置都 flip,概率均为 \(\dfrac{1}{2}\),期望 \(2\) 次可以得到第二种,于是可以确定 \(i\) 的值,然后再期望 \(2\) 次还原,总共期望 \(4 \times 2\) 次操作。根据期望线性性,在期望 \(8n\) 次操作内可以得到原序列。

\(n\) 为奇数时,上述做法可能无法判定原序列与除 \(i\) flip 的序列,但是我们直接暴力求出 \(a_1\) 后对于每个 \(i\) 操作 \([i,i+1]\),套用上述做法即可。

Problem V. CF1699E Three Days Grace

题意:

给定一个初始有 \(n\) 个元素的可重复集合 \(A\),其中每个元素都在 \(1\)\(m\) 之间。

每次操作可以将 \(A\) 中的一个元素(称之为 \(x\))从 \(A\) 中删除,然后在 \(A\) 中加入两个元素 \(p,q\),满足 \(p \times q=x\)\(p,q>1\)

显然每次操作后 \(A\) 的大小会增加 \(1\)

定义 \(A\) 的平衡值为 \(A\) 中的最大值减去最小值,求任意次操作(可以是 \(0\) 次)后最小可能的平衡值。

\(1 \leq n \leq 10^6\)\(1 \leq m \leq 5 \times 10^6\)。时限 \(4\) 秒,空间限制 \(256\) MB。

解法:

为了最小化极差,不妨枚举最小值 \(x\),求出将所有数因数分解,每个因数都至少为 \(x\) 时因数的最大值最小是多少。

考虑 DP,记 \(f_{i,j}\) 表示将 \(j\) 因数分解,每个因数都至少为 \(i\),最大因数最小是多少。容易发现若 \(i\) 不是 \(j\) 的因数,有 \(f_{i,j}=f_{i+1,j}\),同时若 \(i \mid j\)\(i^2 >j\),此时 \(\dfrac{j}{i} < i\),已经无法分解因数,所以 \(f_{i,j} = j\),否则必有 \(f_{i,j}=f_{i,\frac{j}{i}}\),意思是先将 \(j\) 除以 \(i\) 然后继续分解。

逆序枚举 \(i\),发现 \({f_{i,j}}_{\max}\) 单调不升,维护 \(f\) 的出现次数的桶双指针即可。复杂度 \(O(m \log m+n)\)

Submission Link.

Problem W. P6982 [NEERC2015] Jump

题意:

这是一道交互题。

有一个长度为 \(n\) 的 01 字符串 \(S\)\(n\) 为偶数。

你可以向交互库进行询问。你可以向交互库输出一个长度为 \(n\) 的 01 字符串 \(Q\)。设 \(S\)\(Q\)\(k\) 个对应的位置上的字符相同。若 \(k=n\)\(k=\dfrac n 2\),则交互库将返回 \(k\),否则交互库将返回 \(0\)

你需要在最多向交互库询问 \(n+500\) 次情况下求出 \(S\)。交互库不自适应。

\(1\leq n\leq 1000\)

解法:

如果能求出某个 \(Q\) 使得 \(k= \dfrac{n}{2}\),此时对于每个 \(i \in [2,n]\),将 \(i\)\(1\) 的状态翻转就知道 \(i\)\(1\) 的状态是否相同。最后至多 \(2\) 次,总共至多 \(n+1\) 次即可求出答案。

然后考虑如何求出符合条件的 \(Q\),发现每次随机一个串,期望的 \(k\) 恰好为 \(\dfrac n 2\),随机 \(499\) 次,有极大概率能随机到某个 \(k=\dfrac n 2\),问题解决。具体分析可以得到 \(\dbinom {2n} n=O(\dfrac{2^{2n}}{\sqrt n})\),所以期望根号轮就能找到。

第二部分其实有确定性算法,考虑所有 \(0\cdots01\cdots 1\) 的串询问即可,但是次数为 \(n\),无法通过。

Submission Link.

Problem X. 元旦激光炮

题意:

这是一道交互题。

有三个序列 \(a_0,a_1,\cdots,a_{n_a-1}\)\(b_0,b_1,\cdots,b_{n_b-1}\)\(c_0,c_1,\cdots,c_{n_c-1}\),保证三个序列都单调不降。给定 \(n_a,n_b,n_c,k\),你要至多进行 \(100\) 次对任意一个序列的某个位置的单点查询,求出三个序列并的第 \(k\) 小值。

\(0 \leq n_a, n_b, n_c \leq 10^5\)

解法:

直接二分可以做到 \(O(\log V \log n)\) 次询问,无法通过。

考虑归并排序的过程,发现我们每次在三个序列中都把第 \(\lfloor \dfrac k 3 \rfloor\) 个数取出,则三个序列中这个数最小的那个序列的前 \(\lfloor \dfrac k 3 \rfloor\) 个数一定不会成为答案,删去即可。询问次数 \(O(\log_3 n)\),可以通过。

Submission Link.

Problem Y. P10786 [NOI2024] 百万富翁

好难啊。

题意:

这是一道交互题。

\(n\) 个人,每个人有 \(w_i\) 元存款且两两不同,你可以进行至多 \(T\) 次查询,每次给交互库两个长度均为 \(k\) 的整数序列 \(a_1,a_2,\cdots,a_k\)\(b_1,b_2,\cdots,b_k\)。交互库会返回 \(c_1,c_2,\cdots,c_k\) 表示对于每个 \(i\)\(a_i\)\(b_i\) 中谁的存款数更大。你的询问还要满足 \(\sum k \leq S\)。你需要求出存款数最大的人的编号。

\(n=1000\)\(T=1\)\(S=499500\)\(n=10^6\)\(T=8\)\(S=1099944\)

交互库可能自适应。

解法:

交互库可能自适应,所以若 \(T=1\),则我们只能两两询问,次数 \(\dbinom{n}{2}\)

进一步地,如果我们动态维护答案预选集合,每次两两相邻询问并淘汰一半,可以做到 \(O(\log n)\) 次查询与 \(O(n)\) 次总询问次数。但是显然查询次数超了。

我们不妨延续这个做法。相当于我们要构造长度为 \(9\) 的序列 \(p_1,p_2,\cdots,p_9\),满足 \(p_1=10^6\)\(p_9=1\),然后对于每个 \(i\),花若干代价使答案预选集合大小变为 \(p_{i+1}\)。这个代价是容易计算的,平均分组询问即可。

对着这个序列 DP,或者爆搜剪枝,或者模拟退火等,都可以找到一组合法的解。事实上还可以证明 \(1099944\) 是下界,但显然我不会。

一组合法的解是,\(p=[10^6,500000, 250000, 125000, 62500, 20833, 3472, 183, 1]\)

Submission Link.

Problem Z. P3561 [POI2017] Turysta

题意:

给出一个 \(n\) 个点的有向竞赛图,任意两个点之间有且仅一条有向边。

对于每个点 \(v\),求出从 \(v\) 出发的一条经过点数最多,且没有重复经过同一个点两次或以上的简单路径。你需要输出路径长度与具体的路径。

\(2 \leq n \leq 2 \times 10^3\)

解法:

一眼看去,图上最长路是不太能做的,但是这是一个竞赛图。

我们给出如下结论:

Lemma 1. 任意有向竞赛图必然存在哈密顿路径。

Lemma 2. 任意大于 \(1\) 个点的强连通有向竞赛图必然存在哈密顿回路。

我们先声称这是对的,然后对于图缩点,拓扑排序,每个 SCC 内部答案一样,记 \(f_i\) 表示这个 SCC 出去最长路径长度,然后 \(f_i = \max \limits_{(i,j)\in E} f_j + cnt_i\) 即可求出最长路径长度。具体来说,对于经过的每个 SCC,都可以从这个点开始走一个哈密顿回路,并且在回路最后一个点往下一个 SCC 走。因为整个图是竞赛图所以必然存在最后一个点到下个 SCC 内某个点的边。

现在,只要我们能解决强连通竞赛图的哈密顿回路构造方案即可解决本题。

先思考任意有向图的哈密顿路径。考虑增量构造,初始令 \(p=[1]\),依次考虑每个点 \(u \in [2,n]\)。若路径末尾指向这个点,或这个点指向路径起点,则直接在前或后加入即可。否则此时这个点指向路径末尾,路径起点指向这个点。我们考虑若路径上存在某两连续点 \(p_i,p_{i+1}\),满足 \(p_i \rightarrow u\)\(u \rightarrow p_{i+1}\),则求出一条新的哈密顿路径,从 \(p_1\)\(p_i\),跳到 \(u\),然后到 \(p_{i+1}\),接着一直到 \(p\) 的末尾。事实上必然存在这样的 \(i\),因为一个 \(01\) 序列满足第一位是 \(0\),最后一位是 \(1\),则中间必然有 \(01\) 交替。

现在我们对任意有向竞赛图都能求出一条哈密顿路径。现在考虑此图连通,求一个哈密顿回路。求出的哈密顿路径已经是回路则不用处理。否则考虑哈密顿路径最长前缀,使得前缀最后一个位置指向路径第一个点。此时我们已经求到了一个环。然后依次加入前缀下一个点到哈密顿路径最后一个点,不妨设现在加入点 \(u\),若之前的环中每个点都指向 \(u\),则跳过这个点考虑下个点。否则容易找到一个新的包含所有点的环,具体来说不容易文字描述,画画图就知道了。由于图强连通,不可能有一段后缀都被跳过,故构造成立。

我们在 \(O(n^2)\) 的复杂度内解决了此题。

Submission Link.

posted @ 2024-10-07 20:48  HappyBobb  阅读(50)  评论(0)    收藏  举报