CF1333F Kate and imperfection
有一个集合 (S={1, 2, cdots, n}) ,定义 (Tsubseteq S) 的权值为 (max{gcd(a, b) | a, bin T, a eq b})
对于每个 (i) ,求出所有 (|T|=i, Tsubseteq S) 中,最小的权值
(nleq5 imes10^5)
考虑权值为 (i) 时, (T) 的最大大小
权值为 (1) 时, (T) 显然可以包含 (1) 和 ([1, n]) 中的所有质数
权值为 (2) 时,可以往 (T) 中添加 (4)
权值为 (3) 时,可以往 (T) 中添加 (6, 9)
权值为 (4) 时,可以往 (T) 中添加 (8, 12)
权值为 (5) 时,可以往 (T) 中添加 (10, 15, 20, 25)
(cdots)
可以发现,当权值为 (i) 时,会往 (T) 中添加所有最大真因子等于 (i) 的数(可以感性理解(×))
因此线性筛,筛出每个 (i) 的最小质因数即可(最小质因数×最大真因子=num)
CF1326E Bombs
给定两个长度均为 (n) 的排列 (p, q) 。对一个初始为空的集合 (s) 进行如下操作:对于每个 (i) ,将 (p_i) 放入集合;如果 (i) 被标记了,则此时再将集合中最大的数删除。求 (n) 次操作后集合中最大的数。
排列 (q) 的意义是,对于每个 (i) ,询问将 (q_1, q_2, cdots, q_{i-1}) 都标记之后的上述操作的结果。
(nleq3 imes10^5)
答案显然递减,考虑在什么情况下当前答案 ans 会减小
如果存在一个位置满足它右侧(包括自身)大于等于 ans 的数的个数 大于 它右侧(包括自身)被标记的数的个数,容易发现该状态是合法的,可以用线段树维护
杂题
坐标系上有 (n) 个互不相同的整点 (a_i) ,有一个定值 (L) ,有 (q) 个询问:
- 将 (a_x) 改为 (y)
- 可以花费 (1) 的代价覆盖区间 ([i, i+L-1]) , (i) 可取任意数,求覆盖 (n) 个点的最小代价
- (nleq5 imes10^5)
- (a_i, Lin[1, 10^9])
单次询问,如果 (a_i) 是递增的,可以 (O(n)) 贪心:每次找到最靠前的没被覆盖的点,以它作为左端点覆盖一次区间,伪代码:
for i : a[1..n]
if (s < i) ans++, s = i + L - 1
return ans
可以用类似弹飞绵羊的思路,用块状链表维护排序后的 (a_i) ,对每个点维护它跳多少步才能跳出块,跳出块后落在了哪里,时间复杂度大概是 (O(nsqrt{nlog n})) 的
以下 (a_i) 都指排序后的点坐标
对于一个点 (pos) ,找到 (pos+L) 的非严格后继,考虑将 (pos+L) 与 非严格后继 拆开,对于原来的每个点 (a_i) ,新建一个中继点 (b_i=a_i+L) ,对于每个 (b_i) 维护它的非严格后继,维护它的非严格后继,这个非严格后继可以是 (a) 中的元素也可以是 (b) 中的元素,如果没有则为 (0) ;可以用 set 辅助,支持单次 (O(log n)) 修改时维护 (a_i, b_i)
将 (a_i) 向 (b_i) 连边, (b_i) 向 它的非严格后继 连边,可以发现这形成了一个以 (0) 为根的 (2n+1) 个点的树,而答案即为从 (a_1) 到 (0) 的路径上经过的 (a) 中元素的个数,能用 lct 维护,时间复杂度 (O(nlog n))
杂题
给定一棵 (n) 个点的带边权树,有 (m) 个男生和 (m) 个女生,每个人必须选择树上的一个点,可以有多个人选择同一个点,可以有没有被选择的点。定义一种选择方案的权值为:将这些人匹配成 (m) 对男女,设 (dis_i) 是第 (i) 对男女在树上的最短距离,找到一种匹配方式使得 (displaystylesum_{i=1}^mdis_i) 最大,这个最大值即为方案权值
求出这 (n^{2m}) 种方案的权值和 (mod{10^9+7})
(n, mleq2500)
任选一个点为根,对于一条边,如果它的子树中有 (x) 个男生, (y) 个女生,它对答案的贡献是 (w_i imes(min(m-x, y)+min(x, m-y))) ,感性理解即可
对于每个点,枚举它子树中的 ((x, y)) 统计答案,若它的子树大小为 (sz) ,它到父亲的边权为 (w) ,它对答案的贡献为 (displaystyle winom{m}{x}inom{m}{y}sz^{x+y}(n-sz)^{m-i+m-j})
然后使用前缀和优化一下,可以只枚举每个点的 (x) ,这里就不详细说明了
杂题
定义一个串是好的,当且仅当将这个串首尾相接以后,相邻字符两两不同
给定一个串 (S) ,将它首尾相接,对于每个 (kin[0, |S|)) ,求出是否能够删掉连续的 (k) 个字符,使得剩下的串连接起来后是好的
(displaystylesum|S|leq5 imes10^6)
将 (S) 复制一份接在自己后面,问题就变成了删掉长度和为 (k+|S|) 的一段前缀和一段后缀
如果有相邻的两个字符,将 (S) 从这里断开,对答案的贡献不变。现在只需要考虑首尾相同的情况
对于 (S) 的一段子串 (T) ( (forall 1leq i<|S|, T_i eq T_{i+1})),如果不存在长度为 (k) 的子串满足首尾不同,则可以得出 (forall 1leq ileq|T|-k, T_i=T_{i+k}) ,即 (T[1..n-k+1]=T[k..n]) ,可以用 kmp (O(n)) 解决
杂题
给定一棵 (n) 个点的带边权树,有 (m) 个关键点,在关键点中随机选出 (k) 个点,定义一种选择方案代价为:从树上任意位置出发,走遍所有选出的点,这条路径(不一定是简单路径)的边权和。求出期望代价 (mod998244353) 的值
- (nleq10^5)
- (1leq kleq mleq 500)
- 边权非负
从树上任意一点出发,遍历树上所有点,所需的代价等于 树上边权和乘以二减去树的直径
证明:任选一个点为根,从根出发以根结束的代价为 树上边权和乘以二;从根出发任意点结束的代价为 树上边权和减去根到离根最远点 (u) 的距离,因为一定存在一种方案,使得 (u) 是被访问的点;将根取为直径的一段即可
现在要求 (E() 选 (k) 个点导出子树的边权和乘以二 (-) 导出子树直径 ()) ,根据期望的线性性,可以将两部分拆开求
导出子树边权和,可以统计原树上的每条边对答案的贡献,设 (u) 子树内有 (cnt) 个关键点,边 ((u, fa_u)) 的边权为 (w) ,这条边对答案的贡献即为 (w imes (1-displaystylefrac{inom{cnt}{k}+inom{m-cnt}{k}}{inom{m}{k}})) ,因为这条边的出现概率为 (1-) k个点都出现在u子树的概率 (-) k个点都没有出现在u子树得概率
导出子树直径,可以枚举直径的两端 (i, j (i<j)) ,对于 (dis_{i, k}<dis_{i, j}) 且 (dis_{k, j}<dis_{i, j}) 的点 (k) 可以加入导出子树,如果 (dis_{k, j}=dis_{i, j}) ,当且仅当 (k<j) 才能够加入,否则,若 (dis_{i, k}=dis_{i, j}) ,当且仅当 (k<i) 才能够加入;这样就能避免重复计数
贴一个结论在最后/kk
边双内任意两点之间一定存在至少两条边不相交路径