还没补E,感觉很GF。
个人感觉质量挺好,拿 CF Div.2 来对标也是出的比较好的一场。唯一的缺陷可能是E/F应该换个位置?
简要写个题解?
A
给定数组 \(a\),以及常数 \(k\),定义 \(w(i,j)\) 当 \(|a_i-a_j|>k\) 时候为 \(\max(a_i,a_j)\),否则为 \(\min(a_i,a_j)\)。
显然排序之后贪心将 \(w(n-1,n),w(1,n)\) 取 \(\max\) 即可。
\(O(n\log n)\),可以优化到 \(O(n)\)
B
给定一个正整数 \(N\) 的质因子分解 \((p_i,c_i)\),\(N=\prod_{i=1}^np_i^{c_i}\),给定 \(d\),求 \(\sum_{i|N}i^d\)。对 \(10^9+7\) 取模。
显然就是
\[\prod_{i=1}^n(\sum_{j=0}^{c_i}p_i^{d·j}) \]不知道后面这个式子用等比数列求和分母会不会变成零,总之对于 \((1+p+p^2+p^3+……+p^m)\) 可以利用分治法进行求解。
也即设原式值为 \(S(p,m)\),当 \(m\) 为奇数时,可以 \(S(p,m)=S(p,m-1)\times p+1\)。
否则有 \(S(p,m)=(S(p,m/2)-1)\times p^{m/2}+S(p,m/2)\),可以 \(O(\log^2 m)\) 计算。
\(O(n\log^2 n)\)
C
给定 \(n\) 点 \(m\) 边带权无向图,多次询问 \(L,R\),求能否选出一个边集,使得至少有 \(L\) 个连通块,至多有 \(R\) 个连通块,如果可以,求出这个边集里可能的最小边权的最大值。
容易发现 \(L\) 是基本全没啥用的。因为我们可以通过对这个边集把除了答案边之外的边一条条删去,肯定会增加连通块个数。
更加形式化一点,对于答案边 \((u,v,w)\),其所有的边 \((u_i,v_i,w_i)\) 若有 \(w_i\ge w\),则将其加入 \(E\) 中一定不影响答案。
假定全部加入这样的边后有 \(k\) 个连通块,那么我们显然可以通过这些边做到有 \([k,n-1]\) 个连通块。
证明:考虑加入所有边后,对各个连通块都求一颗生成树,其余非生成树边删去,那么我们可以任意断开一条非答案边都会使得答案不变且连通块个数增加一,最终可以做到只保留答案边,\(n-1\) 个连通块。
那就简单了,直接模仿 Kruskal 算法,将边权从大到小排序,依次加入,维护连通块个数。不妨设加入 \([1,i]\) 边后有 \(c_i\) 个连通块。
那就是找到第一个 \(\le R\) 的 \(c_i\),其 \(w_i\) 即为答案。找不到就无解。
\(O((n+q)\log n)\)
D
给定一棵树,最初全为白色,要求将至多 \(k\) 个点染为黑色,要求最终白色点对之间距离最大的最小。\(0\le k<n-2<n\le 1000\)
显然二分答案。
我们倒过来看最终局面,我们断言最终局面,所有白点定然是一个连通块。
证明:如果不是这样,考虑一个孤立的白点,将其染为黑色,然后将原白点连通块与该白点最长路径上遇到的第一个黑点变白,答案一定不会变差,因为以该白点为端点的所有路径的最大值定然比这个新的白点与连通块中点的所有路径最大值更大。对每个白点都进行这样的操作,最终一定会变成一个连通块。
那么假设二分答案为 \(mid\),我们要判断能否选出一个连通块,在满足直径不长于 \(mid\) 的情况下,大小为 \(n-k\)。
更强的信息:求出可以选出的最大大小的连通块。
不妨设 \(f_{u,i}\) 为在子树 \(u\) 内,包含 \(u\),最长链为 \(i\) 的合法连通块最大大小。
初始:\(f_{u,0}=1\)
转移:\(f'_{u,\max(i,j+1)}=\max(f_{u,\max(i,j+1)},(f_{u,i}+f_{v,j})[i+j+1\le mid])\)
然后所有可行的最大的 \(f_{i,j}\) 即为所求。
\(O(n^2\log n)\)。
说个需要注意的点:其实我们在二分 \(mid\) 后可以将所有距离 \(\ge mid\) 的点对全部连边,就是判断是否存在一个点覆盖,满足其大小 \(\le k\)。
也就是最小点覆盖问题。我因为把一般图最小点覆盖和二分图最小点覆盖搞混,打网络流吃了2罚时
E
暂时不会,感觉很生成函数(有点组合符号化的构造感觉)。MD我生成函数学的像个什么一样
F
给定一颗基环树,保证不是自环,每条边有边权,定义简单路径为 不经过重复边 的路径,定义路径权值为路径上所有边边权的异或和。
给定 \(k\),求所有下标差不超过 \(k\) 的点中,最大的路径权值是多少。
草了看成了不经过重复点,居然有75,恐怖如斯
首先如果是一棵树,我们直接预处理 \(dis_i\) 为根到 \(i\) 路径的权值,然后利用 \(trie\),记录一个最大时间戳直接查就完了,这是经典问题。
对于环的处理,我们先考虑第一类路径:顺时针走。
考虑选定环上一个点为起点,然后先对环做一个异或前缀和作为环上点的 \(dis\),然后对于环上各个点再跑 DFS 处理出各自点的 \(dis\) 即可。
那么如果一个点对,下标差不超过 \(k\),简单路径不过环,则直接查(也即按照 \(1\to n\) 将 \(dis_i\) 插入环中,同时查询 \([max(1,i-k),i]\) 的点作为点对)就行了。如果简单路径过环,直接查也可以处理出计算顺时针走法的答案。
这样就70了
然后我们考虑是不经过重复边的路径,那么我们考虑如何判断两点之间简单路径能否经过环,其实也就两种情况:
- 两个点分属环上不同点的子树里
- 两个点在环上同一点的子树里,但其LCA是这个点。
所以不妨设 \(top_u\) 为点 \(u\) 一直向上走,走到环上点的前一个点的编号(亦或者说是环上点的子树)。这个可以通过枚举环上点及其子树预处理出来。
那么 \(top_u\neq top_v\) 就是两个点之间简单路径可以路过环的充要条件。
不妨设整个环的边权异或和为 \(t\),则对于逆时针走环的情况,我们只需要对所有 \(top_j\neq top_i\) 的 \(j\),求 \(dis_j\oplus dis_i\oplus t\) 的最大值。
这个偏序关系仅仅只是一个不等关系,考虑在Trie上时,我们只是需要判断是否可以走那一棵子树。所以我们只在乎那颗子树里是否有点,满足其 \(top\) 不等于 \(top_i\),且编号 \(\ge i-k\)。
这个问题不用想得太复杂,我们对于Trie上,维护两个二元组 \((top,id)\)。要求两个 \(top\) 不相同,且 \(id\) 尽量小。
意思就是第一个二元组记录该子树里,出现时间最晚的点的 \(top\) 值以及出现时间。
第二个二元组记录该子树里,\(top\) 不同的出现时间最晚的点的 \(top\) 值以及出现时间。
这样查询就行了。
但是需要特判一下Trie里是否有合法解。
标签:连通,练习赛,环上,top,路径,白点,牛客,答案,127 From: https://www.cnblogs.com/spdarkle/p/18287048