2021年第42周总结
10.18
K短路问题
使用Astar算法解决了k短路问题。
这是一道关于严格次短路的问题,使用BFS求解即可.
ABC 223
Problem F
括号序列的套路题目,创建前缀和,线段树维护区间前缀和最小值和区间加和即可。
Problem G
树的最大匹配。
使用树上DP+树上背包解决了一道毒瘤题目:P1623
感觉是我写过最难的树上背包了。
然后尝试去解决这个题,本质思路是树形DP,但不是普通的树形DP,使用了Rerooting DP方法解决了这个题。
10.19
ABC 223
Problem H
这是一道关于线性基的题目。
运用离线后缀查询,需要实时维护线性基中基向量的最早位置。
看着某一位大佬的提交sm搞过去了。
找个时间一起讨论一下这个题。
10.22
ABC 203
Problem D
给定 N × N N \times N N×N 个方格,求出每个 K × K K \times K K×K 方格中中位数最小的那个,考虑二分答案。二分为是否有比 x x x更小的中位数了,符合二段性因此可以二分。二分中check函数使用前缀和转换成01矩阵的方式进行计数即可。
CF 702
Problem F
我们枚举 C C C然后求出需要删除的数字个数即可,考虑每个数字出现 C C C次,我们可以通过前缀和的方式求出小于出现 C C C次数字的个数,减去即可。然后考虑大于等于出现次数 C C C次数字的种类,然后直接计数即可。所以我们需要两个前缀和数组。 n u m [ x ] num[x] num[x]表示小于等于出现 x x x次数字的个数, n u m 1 [ x ] num1[x] num1[x]表示小于等于出现 x x x次数字的种类。
Problem G
和网络赛那个题有异曲同工之处,仍然是列出式子 k × s u m + p s u m i ≥ X i k \times sum + psum_i \geq X_i k×sum+psumi≥Xi 然后根据 s u m sum sum的正负对该式子进行讨论答案,得到最小的 k k k之后,通过二分查找找到符合条件的最小的 i i i的位置即可。
CF 749
Problem E
首先考虑条件成立的必要条件,每个顶点在查询中出现的次数必须为偶数,如果存在奇数节点 v v v,很显然那么无论如何也不能将他相邻的边都变成偶数的权值。假设所有的点的出现次数都为偶数,考虑图 G G G的任何一颗生成树 T T T,每对顶点之间的路径都是唯一的,因此,我们只需要每次输出每次查询 ( u , v ) (u,v) (u,v)之间的路径即可。
考虑为什么这么做可行,考虑第一次查询 ( a 1 , b 1 ) (a_1,b_1) (a1,b1),如果我们想让这条路径的边为偶数权,那么我们必须存在一次查询也是 ( a 1 , b 1 ) (a_1,b_1) (a1,b1),或者存在两次查询 ( a 1 , c ) (a_1,c) (a1,c), ( c , b 1 ) (c_,b_1) (c,b1),我们发现顶点是数量都是偶数。假如只存在一条覆盖 ( a 1 , b 1 ) (a_1,b_1) (a1,b1)路径的路径 ( A , B ) (A,B) (A,B),那么就相当于割裂成两个独立路径 ( A , a 1 ) (A,a_1) (A,a1), ( b 1 , B ) (b_1,B) (b1,B)在图中,因为我们假设让一条路径的边为偶数权,只能是每个顶点在查询中出现的次数必须为偶数,所以根据数学归纳法得知:
每个顶点在查询中出现的次数必须为偶数 ⇔ 存 在 某 一 个 生 成 树 的 路 径 覆 盖 \text{每个顶点在查询中出现的次数必须为偶数} \Leftrightarrow {存在某一个生成树的路径覆盖} 每个顶点在查询中出现的次数必须为偶数⇔存在某一个生成树的路径覆盖
10.24
ABC 224
Problem E
考虑当前位置 ( r , c ) (r,c) (r,c)能够到达达最大的一定是下一个比他稍大的那个,因此我们只需要找到每一行比他次大的哪一个即可,因此考虑DP可以求解。
需要注意,因为存在相同的元素,因此要选择相同元素中最大的那个即可。
或者,可以像题解那样,定义两个数组 r m a x [ x ] rmax[x] rmax[x]和 c m a x [ x ] cmax[x] cmax[x]代表 x x x行或列中能到达最大的步数,进行DP维护更新即可。
LC 638
多维背包+状态压缩, n n n进制可以推广至可变基底的进制计数。即位权为 w i = ∏ j = 0 i − 1 ( A j + 1 ) w_i = \prod_{j = 0}^{i - 1}(A_{j}+1) wi=∏j=0i−1(Aj+1), A [ j ] A[j] A[j]为第 j j j位上能取得的最大数码。
CF 750
Problem C
外层枚举删除的字母,从尾部开始构造元素,即 s t r [ l ] = s t r [ r ] str[l] = str[r] str[l]=str[r]那么 l + + , r − − l++,r-- l++,r−−,如果 s t r [ l ] ≠ s t r [ r ] str[l] \neq str[r] str[l]=str[r]并且 s t r [ l ] = d e l str[l] = del str[l]=del,那么就必须删除 l l l位置的字母,另外 s t r [ r ] = d e l str[r] = del str[r]=del也同理,当KaTeX parse error: Undefined control sequence: \and at position 17: …tr[l] \neq del \̲a̲n̲d̲ ̲str[r] \neq del,那么这种方案是不行的。
Problem D
考虑 n n n为奇数时,取前三个 a 1 , a 2 , a 3 a_1,a_2,a_3 a1,a2,a3将这三个数看成一个向量,再挑选两个不共线的向量 v 1 , v 2 v_1,v_2 v1,v2分别做矢量叉乘,取不为零的那个向量即可。