2020 国家集训队作业选做
2020 国家集训队作业选做
CF504E Misha and LCP on Tree
秒了!显然二分加哈希
CF512D Fox And Traveling
考虑到环上的点一定选不了,去掉环后图中会剩下若干棵树
而树分两种形态:
- 根在环上(有根树)
- 无根树
前者考虑直接树形 dp,背包转移,
后者对每个点当根做树形 dp,发现一个选 \(i\) 个点的答案在大小为 \(s\) 的树里被计算了 \(s-i\) 次
最后再对每棵树做背包就好了,复杂度 \(O(n^3)\)
CF516D Drazil and Morning Exercise
我会 \(O(nq\log^2n)\) !
先 \(O(n)\) 换根 dp 出 \(f\) 值,考虑对于每一个询问分别处理
离散化后值域上线段树分治,使用并查集维护连通性
但是过不了,寄
更优秀的做法需要一个重要的观察
注意到 \(f_x=\max_{i=1}^n\operatorname{dist}(x,i)\)
对于任意一个 \(x\),总是在直径端点处取到距离的最大值
我们选取直径中点为根,那么每个点一定满足其子树内的 \(f\) 值均比其 \(f\) 值大
考虑使用倍增+差分,在一个点计算以其为最浅节点的连通块大小,容易做到 \(O(qn\log n)\)
CF521D Shop
考虑只有乘法是简单的,加入加法后由于加法一定在乘法前,且从大到小排序后,使用一个前缀的加法操作,容易用乘法表示加法
赋值考虑只会使用不超过 1 次,转化成加法即可
CF521E Cycling City
考虑限制等价于寻找两个环有边相交
考虑一颗生成树,即存在一条树边被非树边覆盖过至少 2 次
树上差分容易判断,容易得到一组解
CF526F Pudding Monsters
秒了!
考虑将 \(n\) 个棋子按 \(x\) 从小到达排序,记第 \(i\) 个棋子的 \(y\) 坐标为 \(v_i\)
问题等价于计算满足 \(mx-mn=r-l\) 的区间 \([l,r]\) 数量,其中 \(mx,mn\) 为区间 \(v\) 最大最小值
注意到 \(mx-mn\geq r-l\),考虑扫描线+单调栈,维护 \(mx-mn-r+l\) 的最小值及数量,容易计算
时间复杂度 \(O(n\log n)\)
CF526G Spiders Evil Plan
一个有 \(k\) 个叶子的树,需要至少 \(\lceil\dfrac k 2\rceil\) 条路径才能覆盖,且 \(\lceil\dfrac k 2\rceil\) 条一定可行
至少需要 \(\lceil\dfrac k 2\rceil\) 条很显然,考虑给出一个 \(\lceil\dfrac k 2\rceil\) 一定可行的构造
一个可行的构造是以子树内叶子数为权的带权重心为根,将 dfs 序前一半叶子和后一半叶子按位匹配
由于是中心,一定不存在两个 lca 不为根的路径匹配,那么路径显然覆盖了整棵树
(构造是 cxy,zxy 提供的)
考虑直径的一个端点一定会被选在叶子集合里,那么以 2 个叶子为根分别钦定根必选得到的答案取 max 即可
若不考虑 \(x\) 一定要在连通块里的情况,是一个经典问题,我们选取叶子个数条长链即可
考虑 \(x\) 若不在连通块里如何使得修改的代价最小
- 选取 \(x\) 所在的长链,去掉之前贡献最小的一条长链
- 打通 \(x\) 到其祖先第一个被选中的位置,将其子树内最短的一条长链丢掉
实现时 Case 2 其实不需要维护子树内最短的已经被选的长链,考虑如果子树内不止一条长链一定不如 Case 1 优,容易实现
CF527E Data Center Drama
切了!
考虑先加边使得所有点的度数为偶(将奇度点两两匹配连边即可),容易发现还要求总边数为偶(加自环)
然后将所有边随便定向,观察到我们可能有若干个点出入度不为偶,考虑对图上的一条路径进行翻转,中间的点显然状态不变,惟独两边的端点出入度状态发生改变
由于图联通,选取一颗生成树,对两个奇度点的树上路径取反即可,树上差分即可简单维护
还可以用欧拉回路完成此问题,考虑当所有点度数为偶数时,图中存在欧拉回路
考虑将回路的边 \(a-b-c-d\) 定向为 \(a\leftarrow b\rightarrow c\leftarrow d\),容易保证每个点的出入度为偶数
由于总边数为偶,起点也满足条件
CF536D Tavas in Kansas
考虑先跑出 s,t 的单元最短路,进行离散化,将一个点放在二维平面的 \((dis1_i,dis2_i)\) 上
考虑记状态 \(f(i,j,0/1)\) 表示剩下 \(dis1_k\ge i,dis2_k\ge j\),这一次是先手选还是后手选的最终结局(先手得分减后手得分)
显然,直接转移是 \(O(n^3)\) 的
考虑对其进行后缀和优化即可做到 \(O(n^2)\),值得注意的是每一步都不能为空,需要特殊处理
CF555E Case of Computer Network
切了!
容易想到割边是重要的,只能往一边定向
考虑对原图边双缩点,剩下一棵树
对于一个边双显然我们能使其中的每个点两两可以到达
对于不同边双的点我们等价于对其所在边双的树上路径进行定向,容易使用树上差分统计是否有一条边需要两种方向
CF571D Campus
我会仅有第一类集合!
考虑对不同编号的集合启发式合并,每个集合记录一个懒标记,启发式合并时修改小集合的权值即可
发现并不能简单的扩展到存在第二类集合的情况
考虑仅有第一类集合的另一做法
每次合并加入一个虚点,作为两边集合的根的新父亲,显然深度会是线性的,离线得到这棵树
那么 3 操作变成了子树加,容易解决
考虑加上第二类集合,即清零操作
我们仅需求出一个点不考虑清零操作上次清零前的权值和当前的权值作差即可解决
考虑同样离线建出第二类集合操作的合并树,相当于子树赋值
容易完成,复杂度 \(O((n+q)\log(n+q))\)
CF571E Geometric Progressions
会了?
感觉挺好想的,但感觉很多很多细节
鸽着
CF575A Fibonotci
好像非常 sb
直接矩阵快速幂即可
CF576D Flights for Regular Customers
好像不大会,so sad
首先肯定将边按 \(d\) 升序排,考虑一条一条边加入
再新的边加入之前,一定是在已经可以通过的边上走直到苟到新边的加入时间
考虑使用邻接矩阵对每一时刻能到达点集的 01 序列做 &| 乘法
新的边加入后考虑暴力多源 bfs 得到当前走到 \(n\) 的最短路
时间复杂度 \(O(\dfrac{n^3m\log d}{\omega})\)
CF582D Number of Binominal Coefficients
不会啊!
考虑如何转化条件 \(p^{\alpha}|\dbinom n k\)
\(v_p(n!)=\sum_{i=1}\lfloor\dfrac n{p^i}\rfloor\)
考虑 \(\lfloor\dfrac n{p^i}\rfloor-\lfloor\dfrac k{p^i}\rfloor-\lfloor\dfrac {n-k}{p^i}\rfloor\) 要么为 0 要么为 1
事实上,该值为 1 是 \(k\) 与 \(n-k\) 在 \(p\) 进制下做加法时第 \(i-1\) 位进位的充要条件
这实际上是库默尔定理的内容:
\(v_p(\dbinom{a+b}a)\) 为在 \(p\) 进制下 \(a,b\) 做加法的进位次数
设计一个数位 dp 就可以了!
CF585E Present for Vitalik the Philatelist
秒了!
萌萌莫反
考虑枚举子集 \(S\) 的 \(\gcd\) \(d\)
那么答案为 $\sum_{d}(\text{序列 \(a\) 中与 \(d\) 互质的数的个数})\times(\text{\(\gcd\) 为 \(d\) 的集合 \(S\) 个数})$
前者容易莫反得到,后者是一个简单容斥
容易做到 \(O(w\ln w)\),\(w\) 为值域,足够通过,也可以使用狄利克雷前缀和做到 \(O(w\log\log w)\)
CF585F Digits of Number Pi
大概会做,不是很难的样子?
首先可以对 \(t\in [x,y]\) 做一个差分,变成 \((t\in [v,y])-(t\in[v,x-1])\) 的形式
考虑对串 \(s\) 建立 SAM,进行数位 dp
\(f(l,x,len,lim,tag)\) 表示已经处理完前 \(l\) 位,后缀最长能匹配的 SAM 上节点为 \(x\),匹配的长度为 \(len\),前 \(l\) 位是否顶住上限,是否已经匹配出长至少为 \(\lfloor\dfrac d 2\rfloor\) 的子串
就直接 dp 就行了,复杂度 \(O(nd^2\times 10)\)
CF587D Duff in Mafia
秒了!
考虑二分答案 \(k\),我们只能选权值不超过 \(k\) 的边
不合法的情况显然是对于一个点有多条同颜色的边或者是有多对同颜色的边
考虑每条边对应一个布尔变量,分别代表选和不选
选则其对应端点的其他边都不能选
若存在一个节点有两条同色边连接,恰好要选取其中的一条边
第二个条件很好处理,第一个条件考虑前缀、后缀优化建图即可
时间复杂度 \(O(m\log w)\)
CF587F Duff is Mad
秒了!
记 \(S\) 为字符串长度和,上根号分治
对于询问串长度大于 \(\sqrt S\) 的询问考虑不同的串仅有 \(\sqrt S\) 个
预处理 \(s_{1\cdots i}\) 在 \(s_k\) 中的出现次数即可,复杂度 \(O(S\sqrt S)\)
对于询问串长度不超过 \(\sqrt S\) 的询问考虑离线,将询问差分成 \(s_{1\cdots i}\) 在 \(s_k\) 中出现次数的形式
建立一个广义 SAM,对询问进行扫描线
扫描线后移加入串 \(s_i\) 时,在其代表的节点上加权值,询问时询问 \(s_k\) 每个前缀对应节点到根的路径和
注意到有 \(n\) 次修改,\(q\sqrt S\) 次询问,将修改和询问重新描述成子树加,单点求和
容易使用 \(O(\sqrt S)\) 修改,\(O(1)\) 询问的分块即可平衡复杂度
总复杂度 \(O(q\sqrt S)\)
CF590E Birthday
好想,但可能不会实现
考虑建立 AC 自动机两两的子串关系 DAG(偏序集)
考虑问题求得就是 DAG 的最长反链
直接利用 Dilworth 转化成最小链覆盖
只不过还得求方案,就是 [CTSC2008]祭祀
会实现了!
CF611G New Year and Cake
切了!
感觉不大难的样子
考虑求出切一刀面积小的一边的面积和,就能轻松的得到答案了
考虑固定切线的一端,显然存在一个分界点,其左边都是左边为小面积,右边都是右边为小面积
考虑利用叉积的分配律
具体计算式有点小讨论,但并不复杂
分界点可以考虑每次二分,也可以双指针,复杂度 \(O(n)/O(n\log n)\)
CF611H New Year and Forgotten Tree
不会!
\(\texttt{Solution}\ 1\)
将节点按十进制位数分成 \(c=\log_{10}n\) 个颜色
如果有解,考虑钦定树的形态一定为对于每种颜色选择一个关键点,关键点之间呈一棵树
非关键点一定连向关键点(取关键点为父亲)
由于 \(c\) 很小,最多为 \(6\),直接 \(c^{c-2}\) 枚举关键点树形态
考虑非关键点到关键点的边事实上就是一个二分图带权完美匹配,流一下就好
\(\texttt{Solution}\ 2\)
考虑先钦定 \(1\) 为根,那么考虑为每条边定一个方向,即哪边是儿子
定向可以描述为一个二分图完美匹配的模式,左部点为每条边,右部点为每种颜色
每条边向其两端的颜色连边,使用 Hall 定理进行判断
CF627E Orchestra
不会!
首先考虑一个 naive 的 \(O(n^3)\) 做法
考虑计算包含小于 \(k\) 个点的子矩形数目
平方枚举子矩形的行上下界,对于列进行双指针
如何利用 \(n,k\) 很小的限制?
考虑维护所有在枚举的行上下界间的点的一个链表
以列为第一关键字,行为第二关键字,记录每个点链表上往后的第 \(k\) 个点
在每一列第一个出现的点算贡献
考虑行上界不变时,下界从下往上移动——链表删点
链表删除时仅会往前影响 \(k\) 个点
最终复杂度 \(O(n^2k)\)
CF639E Bear and Paradox
会做!
考虑最优顺序是什么
考虑一组 \((i,j)\),考虑它们相邻对答案的贡献,容易分析出 \(\dfrac{p_i}{t_i}\) 降序排列即可
CF639F Bear and Chemistry
切了!
询问即询问两点是否在同一个边双中
考虑先把原图的边双树缩好,每次询问建立点集的虚树,看最后是否能缩成一个边双就好了
感觉很简单