Codeforces Round #947 题解 (A~G)

A. Bazoka and Mocha's Array

枚举每个循环移位判断 .

B. 378QAQ and Mocha's Array

首先最小的数肯定得选,删掉最小的数的倍数后再选一个最小的数,看一下能不能删空即可 .

C. Chamo and Mocha's Array

二分答案 \(x\),把 \(\ge x\) 的位置设为 \(1\)\(<x\) 的位置设为 \(-1\),然后就只需要判断是否存在一个长度不小于 2 的区间和 \(>0\),做一个最大子段和即可 .

D. Paint the Tree

注意到最优的策略一定是先在中点会合然后一起遍历所有点 .

对于从根遍历所有点的最小步数可以发现安排深度最大的叶子最后走即可得到答案 \(2(n-1)-\max dep\) .

E. Chain Queries

一个点集是链当且仅当:

  1. 连通 .
  2. 对于每个点父亲组成的可重集合 \(S\),下面两种情况满足其中一种:
    • \(S\) 中没有重复元素 .
    • \(S\) 中只有深度最大的点出现过 2 次,其他的元素没有重复出现过 .

连通可以算点数减边数,在 BFS 序上建树状数组维护即可 . \(S\) 可以直接用一个桶动态维护 .

F. Set

按位枚举每一位的决策,注意到每确定一位实际上会使一些约束合并,可以动态维护所有剩余的约束进行暴搜 .

因为确定 \(x\) 个数后只剩 \(2^{n-x}\) 个约束,所以直接搜的状态数是 \(\Theta(n2^n)\) 级别的,可以通过 .

G. Zimpha Fan Club

如果两个串都没有 *,按位匹配即可 .

如果两个串都有 *,只需匹配 * 隔开的最前面的串和最后面的串即可 .

对于一个串有 *,一个串没有 * 的情况,按 * 划分成若干段,相当于每次对于一段计算到另一段的最早匹配点然后匹配掉这个位置,只需要支持每次快速找匹配点 .

首先两个只带 - 和字母的串进行匹配可以直接用卷积表示,具体见残缺的字符串 . 对于本题考虑倍增进行这个匹配的过程,这样复杂度就是 \(O(n\log n)\) 的了(因为可以注意到 \(\sum i2^i\sim n2^n\)).

posted @ 2024-05-26 20:36  Jijidawang  阅读(288)  评论(0编辑  收藏  举报
😅​