解题报告(202402)
Codeforces Round 926
D - Sasha and a Walk in the City
dp,主要难点在于设状态。
发现子树内一旦存在一个点,到当前子树的根节点路径上有两个危险点,那么除了那条链所属的子树,其他的点就都不能选了。所以把这个性质放进状态,设 \(f_{u, 0/1}\) 表示以 \(u\) 为根的子树内,是否存在一条到 \(u\) 经过两个危险点的链。
那么转移不难。
这做不出来??????
E - Sasha and the Happy Tree Cutting
发现性质就是弱智题了。
通过虚树可以证明,本质不同的边是 \(O(k)\) 级别的。
所以直接算出所有本质不同的边,暴力 dp 即可。
-
我草我什么时候过的板题。完全没印象。
F - Sasha and the Wedding Binary Search Tree
直接在树上考虑有点麻烦的。
发现可以把题目给的 BST 中序遍历求出来,然后给 -1 填数,要求不降。
然后弱智题,对 -1 连续段算组合数即可。
AtCoder Beginner Contest 341
反思一下为啥做不出来E???
一眼就很典,区间 flip,check 0/1 交替串。
想麻烦了,去想 hash 了, 发现 hash 不好维护,遂摆烂。
应当注意到,所求的性质满足每一个数和前一个数不同,于是有 \(\sum \limits _{i = l - 1} ^ {r} (s_i \operatorname{xor} s_{i - 1}) = r - l\)。直接维护。
发现棋子只能是权值大的给权值小的,大的向小的连边,图是 DAG。
还有一个限制是 \(\sum \limits _{y \in S} w_y < w_x\) ,可以想到在 DAG 上跑背包 dp。
设 \(f_x\) 表示 \(x\) 上的一个棋子最多能贡献多少步操作,\(dp_{x, j}\) 表示在 \(x\) 点,用了 \(j\) 的权值的最大贡献。
如果我们把 \((i, sum_i)\) 看做平面上的点,那么 \([l, r]\) 的平均值就是点 \(l - 1\) 和点 \(r\) 连线的斜率。接着手玩一下不难发现,倒序枚举,维护一个上凸壳即可。
think-cell Round 1
构造 \(\{p_n\} = 1, n, 2,n - 1, \dots\) 可以发现这样无论怎么选择 \(i,j\),总会出现 \(p_i > p_j\) 或者 \(p_{i + 1} > p_{j + 1}\),所以构造成立。
这个,有点厉害的。完全不会了。
发现每一个数最后加入集合时是 \(a_i + i'\) 的形式,于是大胆猜想,能否调整顺序使得 \(i'\) 取到 \([0, i - 1]\) 中任意一个。
得出这个性质后,显然每一个应该构造没取过的最大数,因为当前一共有 \(i\) 个选择,而之前一共选了 \(i - 1\) 个,所以一定能找到这个数。如果 \(a_i + i\) 被选过,那么最优的数一定是当前选择连续段的上一个数,动态维护这个可选集合即可。
Codeforces Round 927 (Div. 3)
div3 F 不会做是不是有点丢人的。。。
考虑如果选当前这个点,那么选的上一个点可能在什么位置。
发现是 \([1,(\min \limits _{l_i \le x \le r_i} l_i) - 1]\)。
然后 multiset 维护这个 \(\min(l_i)\) ,再维护一个前缀最大值即可。
我擦,看错题了,以为不能等。
发现是线性同余方程,用 exgcd 求解 \(k\)。
然后不是我们 CSP-J 2023 T4 吗?这么原。
【LGR-174-Div.2】洛谷 2 月月赛 II & FanOI Round 1
应该先转化题意,距离为 2 提示我们二分图,即对树黑白染色后 \(u_i, v_i\) 颜色相同。
发现当且仅当所有 \((u_i, v_i)\) 连边后,建出的图连通时不合法。
剩余的构造是简单的。
AtCoder Regular Contest 172
发现空间显然尽量留给大块,因为小块一定拼不成大块,而大块可以分成小块。
所以开桶算一下每种块需要多少个和实际有多少个,数量够就分,不够就无解,有剩余的就 \(\times 4\) 分给下一级的小块。
转化题意,不存在相同的长度为 \(k\) 的子序列等价于任意两个相同的字母之间至少间隔 \(n - k\) 个其他字母,否则明显不合题意。为啥没想到这一步呢?
然后比较简单,考虑每个位置有几种选法,前 \(n - k + 1\) 个位置,每个位置可以选 \(L - i + 1\) 个数。下一个位置可以和第一个位置相同,下下个位置可以和第二个位置相同,以此类推,接下来 \(k - 1\) 个位置每个位置可以选 \(L - (n - k)\) 个数。
乘起来就算完了。
比 B 简单,一共 \(n\) 种方案,考虑 \(1\) 从左到右移动时会产生贡献的条件。
发现假设 \(1\) 移动到了 \(i\) 前面,那么唯一不一样的位置就是 \(i - 1\) 放什么,比较 \(1\) 和 \(i\) 放在这个位置所得的符号是否相同即可。