「Log」做题记录 2024.1.29-
\(2024.1.29-2024.2.4\)
\(\color{royalblue}{P5903}\)
树上 \(k\) 级祖先模板,长链剖分。
\(\color{blueviolet}{CF1009F}\)
长链剖分优化 DP 板子,每次继承重子节点信息,指针处理下下标平移,剩余节点暴力合并,复杂度线性。
\(\color{blueviolet}{P5904}\)
长链剖分优化 DP。
设 \(f_{i, j}\) 表示节点 \(i\) 字数内距 \(i\) 距离为 \(j\) 的点的个数。
设 \(g_{i, j}\) 表示满足一下条件的无序点对 \((x, y)\) 个数,\(i\) 子树外若存在距 \(i\) 距离为 \(j\) 的节点 \(z\),则 \((x, y, z)\) 是一组合法三元组。
边转移边统计答案,简单乘法原理处理即可。
\(\color{blueviolet}{P3441}\)
长链剖分优化贪心。
显著的,直径肯定要选,然后每次选的时候肯定跨直径最优,如果存在两对不跨直径的点对,显然可以转换为两个跨直径的点对。
把直径一端拎起来当根节点,然后取最长的 \(2m - 1\) 个长链即可。(因为发现上文说的那个东西和取叶子节点覆盖是等价的。)
\(2024.2.5-2024.2.11\)
\(\color{black}{CF1381D}\)
比较简单的一道(跟高深题目相比)。
如果存在一个点蛇可以到达,并且这个从这个点出发有三条不相交(除了这个点)并且长度不小于蛇的路径,那么蛇可以在这个点调头,即答案为 YES
。
充要性较为显著。
如果可以到达其中一个可行点,那么剩余的可行点显然都能到达,所以以一个可行点为跟尝试判断,当蛇可以调整为首尾有祖先关系时则可行。
可以换根 DP 求一下合法的点,然后预处理每个节点子树内最深的(叶子)节点,贪心地每次将蛇的一端调整至子树内最深点,再调整另一端,直到合法或者循环。
\(2024.2.12-2024.2.18\)
\(\color{black}{CF671E}\)
高深题,题解咕咕咕了,大体思路即从前缀和入手进行大小比较,式子改造后线段树维护。
\(\color{black}{CF1558F}\)
用到一个 Trick,将值域降低为 \(0/1\),将每一个数归为的最大操作次数即答案。
枚举分界点,每次将一个 \(1\) 变为 \(0\)。先考虑固定不变的时候操作次数是如何变化的,显然一个 \(0\) 要归位要么把前面的所有 \(1\) 都走一遍,要么被挤在上一个 \(0\) 后面,等前一个归为后再归为当前这个 \(0\)。分两种取值维护最大值即可,变化显然可以用线段树维护。
\(\color{black}{CF1693E}\)
神秘题,咕咕咕。
\(2024.2.19-2024.2.25\)
\(\color{black}{CF526G}\)
经典结论,如果选尽量选叶子节点,并且一定会选到一个直径端点,直接将直径端点拎出来维护两棵树。
然后就是长链剖分优化贪心,如果询问节点不包括在最优选择中有两种调整方式:
- 去掉最短长链贡献,选择当前节点子树内最深叶子重新计算贡献。
- 找到当前节点第一个已经在路径内的祖先,去掉祖先子树内已经被选择的叶子节点(这种情况最优当且仅当找到的这个祖先节点子树下选择了一个叶子节点,因此不用考虑会影响答案),选择当前节点子树内最深叶子节点。
贡献维护是简单的,用叶子节点代表一条重链,维护一下子树内最深节点,维护下节点深度,需要一定码力。
\(\color{blueviolet}{CF1916F}\)
比较巧妙的题。
保证了没有割点,是重要的性质。
考虑维护两个点集 \(S_1, S_2\),\(S_1\) 初始为空,\(S_2\) 初始包含图中所有点。
每次尝试寻找一个在 \(S_2\) 的导出子图中不为割点并且与 \(S_1\) 集合中的点相连的点,从 \(S_2\) 移动至 \(S_1\)(第一次随意),并把与此点相连的所有点打上标记,便于判断是否与 \(S_1\) 集合中的点相连。
正确性较为显然,不难证明一定存在这样的点,反证法即可。