Solution Set -「LOCAL」冲刺省选 Round XXIII
\(\mathscr{Summary}\)
有一说一,虽然我炸了,但这场锻炼心态的效果真的好。部分分聊胜于无,区分度一题制胜,可谓针对性强的好题。
A 题,相对性签到题。这个建图确实巧妙,多见见就好。
B 题,小常数暴力卡常,证了复杂度就是正解,这……
C 题,写了个伪解 ha 了差不多一个小时才 ck 掉,浪费了很多时间,策略问题啊。
\(\mathscr{Solution}\)
\(\mathscr{A}-\) 一般图带权多重匹配
给定 \(\{a_n\}\),\(\{c_{n\times n}\}\),每次操作取一对 \((i,j)\),令 \(a_i\leftarrow a_i-1,a_j\leftarrow a_j-1\),代价为 \(c_{i,j}\)。求使 \(\{a_n\}\) 全为 \(0\) 的最小代价。
\(n\le50\),\(a_i\le100\),\(k:=\sum_i[2\nmid a_i]\le8\)。
这个 \(k\) 的限制一看就是 NPC 的问题的弱化,这提示我们从 \(\forall i,2\mid a_i\) 的情况入手。对于每个使所有 \(a_i=0\) 的策略,其选择方案可以看做 \(n\) 个结点间的连边方案,结点 \(i\) 的度数为 \(a_i\),\(2\mid a_i\),那么我们自然有办法对每条边定向,使得每个点出度入度相等。
反过来,人为规定:加入 \(\sum_ia_i\) 条有向边,使得点 \(i\) 的出度和入度都为 \(\frac{a_i}{2}\),因此可以得到费用流模型:
- 令 \(i\) 对应结点 \(i_1,i_2\),连接 \(\lang S,i_1,\frac{a_i}{2},0\rang\),\(\lang i_2,T,\frac{a_i}{2},0\rang\);
- \(\forall i,j\),连接 \(\lang i_1,j_2,+\infty,c_{ij}\rang\)。
这个网络的最小费用就是答案!
考虑奇数,其实也没啥事了,\(\binom{k}{k/2}\) 枚举多出来的 \(1\) 放在 \(i_1\) 还是 \(i_2\),相当于枚举多出来的是一个入度还是出度。最终复杂度为 \(\mathcal O\left(\binom{k}{k/2}\operatorname{Dinic}(2n+2,n+n^2)\right)\)。
\(\mathscr{B}-\) 排序
(略有简化。)给定一棵含有 \(n\) 个结点,以结点 \(1\) 为根的树。每个叶子有一个非空取值集合,你需要构造叶子的取值方案,使得存在一种 DFS 方法使遍历到的叶子的值单调递增。若有解,输出取值方案及 DFS 方案。
令 \(m_i\) 为 \(i\) 的取值集合大小(若 \(i\) 非叶,则 \(m_i=0\)),\(k\) 为结点最多拥有的孩子数量,则 \(n,\sum_i m_i\le10^5\),\(k\le8\)。保证取值集合所有元素互不相同。
有一个非常显然的暴力:令 \(f(u)\) 表示 \(u\) 子树内极小取值区间集合,定义合法取值区间 \([l,r]\) 极小当且仅当不存在合法取值区间 \([l',r']\),使得 \(l\le l'\le r'\le r\)。转移时全排列枚举孩子顺序以及左端点,一路 lower bound 过去得到对应右端点,最后删掉不极小的取值区间。
进一步,这个全排列过程可以优化为:枚举第一个孩子及其左端点,状压其余孩子求最小右端点。设 \(u\) 的孩子们的 \(f\) 集合大小为 \(s_1,s_2,\cdots,s_k\),则转移 \(u\) 的复杂度为 \(\mathcal O(\left(\sum_is_i\right)2^{k-1}\left(\sum_i\log s_i\right))\),其中 \(\log\) 是转移内部的 std::lower_bound,也许可以优化掉叭 awa;转移复杂度之和是算法瓶颈。
加一个优化:若 \(u\) 只有一个孩子,作常数的处理之后直接继承这个孩子的 \(f\) 信息。
好,现在我们证明这个暴力是对的(?!)
考虑某片叶子 \(l\) 处的取值集合 \(S\),我们称 \(x\in S\) 是 \(u-\)contributor,当且仅当 \(x\) 是 \(f(u)\) 内某个区间的左端点。对于 \(l\) 的祖先 \(u\),定义 \(S_u=\{x\in S\mid x\text{ is }u-\text{contributor}\}\),初始时自然有 \(S_l=S\)。现对于 \(l\) 的拥有至少两个孩子祖先 \(v\),及 \(v\) 的父亲 \(u\),考虑 \(S_v\) 变到 \(S_u\) 的过程:
显然 \(S_u\subseteq S_v\),显然 \(\forall x,y\in S_u\),\(x\neq y\),构成 \([x,x']\in f(u)\) 的转移区间序列 \(X=\lang [x,x_1],[x_2,x_3],\cdots\rang\) 与构成 \([y,y']\in f(u)\) 的转移区间序列 \(Y=\lang [y,y_1],[y_2,y_3],\cdots\rang\) 必然满足:\([x_2,x_3]\neq [y_2,y_3]\)。
这一点表明,若 \(v-\)contributor 想要成为 \(v-\)contributor,就必然需要 \(v\) 的一个独一无二的 contributor 给予“支持”(注意并不一定消耗这个 contributor)。
现在,我们抛却所有题目本身的性质,只考虑这个弱化限制下的 contributor 总量:设 \(u\) 的孩子们 \(v_1,v_2,\cdots,v_k\) 给到 \(u\) 的 contributor 数量是 \(c_1,c_2,\cdots,c_k\),不妨设 \(c_1\le c_2\le \cdots\le c_k\),根据我们的 contributor lemma,我们知道
\]
因而
\]
最后,把问题放在全局,令 \(c_u\) 表示 \(u\) 对父亲的 contributor 数量,特别地,\(c_1=|f(1)|\);令 \(s_u\) 表示 \(u\) 的子树内所有叶子取值集合大小和,那么
\]
根据结论:
\sum_uc_u &\le |f(1)|+ 2\sum_u\sum_{v\in\operatorname{son}(u)\\v\neq\arg\max\{|f(w)|w\in\operatorname{son}(u)\}}|f(v)|\\
&\le |f(1)|+2\sum_u\sum_{\dots} s_v\\
&= \mathcal O(n\log n).
\end{aligned}
\]
(假定 \(n,m\) 同阶。可以发现第二步表述的就是 DSU on Tree 的复杂度。)
因此,我们得到该算法的一个复杂度上界:\(O(k2^{k-1}n\log n)\)(crashed 指出 std::lower_bound 的确可以优化掉)。算出来大概是 \(1.7\times10^9\),不过至少摆脱了“暴力 \(n^2\)”的范畴;况且 \(k2^{k-1}\) 很难在每个点取满,所以还是比较令人信服的算法。(
\(\mathscr{C}-\) 传染
给定一棵含有 \(n\) 个点的有边权的树,结点 \(u\) 爆炸会使与其距离不超过 \(r_u\) 的结点爆炸。求至少要人为起爆多少个结点才能使所有点爆炸。
\(n\le3\times10^5\)。
点分治 + Two-pointers 优化建图。每次考虑跨过点分中心 \(x\) 的爆炸传导路径,求到结点们分别按“引爆其他子树的能力”和“被其他子树引爆的能力”排序的序列 \(S,T\),发现每个 \(s\in S\) 连向 \(T\) 的前缀;\(s_i\) 能影响的结点是 \(s_{i+1}\) 能影响的子集。建虚点优化建图跑 Tarjan 即可。
点数和边数都是 \(\mathcal O(n\log n)\) 的,不过排序序列造成了瓶颈 \(\mathcal O(n\log^2n)\)。不考虑 Radix Sort 等不讲武德的东西,猜测可以用边分树 + 归并处理两个序列做到 \(\mathcal O(n\log n)\)?
Solution Set -「LOCAL」冲刺省选 Round XXIII的更多相关文章
- Solution Set -「LOCAL」冲刺省选 Round XXV
\(\mathscr{Summary}\) 读错题了读错题了 B 题差点没做出来真的太吓人了. 逆序开题,C 题直接冲一发暴力最大权闭合子图居然过了.A 题确实一下子没想到用"可能的 ...
- Solution Set -「LOCAL」冲刺省选 Round XXIV
\(\mathscr{Summary}\) 名副其实的 trash round,希望以后没有了. A 题算好,确实一个比较关键的简化状态的点没想到,所以只拿了暴力(不考虑 \(\mathcal ...
- Solution Set -「LOCAL」冲刺省选 Round XXII
\(\mathscr{Summary}\) 和出题人很有缘分但是没有珍惜.jpg A 题有一个显然的二维偏序斜率式,以及显然的 CDQ 套李超树 \(\mathcal O(n\log^2n)\ ...
- Solution Set -「LOCAL」冲刺省选 Round XXI
\(\mathscr{Summary}\) 省选几个小时啊,怎么模拟赛只打三个小时啊./kk 时间安排较为合理,没有出现严重的因思考时间过少引起的丢分. A 题比较可惜,二分 + 点分治大 ...
- Solution -「LOCAL」过河
\(\mathcal{Description}\) 一段坐标轴 \([0,L]\),从 \(0\) 出发,每次可以 \(+a\) 或 \(-b\),但不能越出 \([0,L]\).求可达的整点数. ...
- Solution -「LOCAL」画画图
\(\mathcal{Description}\) OurTeam. 给定一棵 \(n\) 个点的树形随机的带边权树,求所有含奇数条边的路径中位数之和.树形生成方式为随机取不连通两点连边直到全 ...
- Solution -「LOCAL」充电
\(\mathcal{Description}\) 给定 \(n,m,p\),求序列 \(\{a_n\}\) 的数量,满足 \((\forall i\in[1,n])(a_i\in[1,m])\l ...
- Solution -「LOCAL」二进制的世界
\(\mathcal{Description}\) OurOJ. 给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...
- Solution -「LOCAL」大括号树
\(\mathcal{Description}\) OurTeam & OurOJ. 给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...
随机推荐
- go.mod file not found in current directory or any parent directory; see 'go help modules'
go的环境设置问题,执行 go env -w GO111MODULE=auto 我的环境:Windows 7, Go 1.17 D:\Apps\GOPATH\src\code.oldboyedu.co ...
- Hive与MapReduce相关排序及自定义UDF函数
原文链接: https://www.toutiao.com/i6770870821809291788/ Hive和mapreduce相关的排序和运行的参数 1.设置每个reduce处理的数据量(单位是 ...
- STM32 EXTI(外部中断)
一.EXTI 简介 EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20个中断/事件线.每个中断/事件线都对应有一个边沿检测器 ...
- 【Java常用类】BigDecimal
BigDecimal 一般的Float类和Double类可以用来做科学计算或工程计算,但在商业计算中, 要求数字精度比较高,故用到java.math.BigDecimal类. BigDecimal类支 ...
- R语言:关于rJava包的安装
R语言:关于rJava包的安装 盐池里的萝卜 2014-09-14 00:53:33 在做文本挖掘的时候,会发现分词时候rJava是必须要迈过去的坎儿,所以进行了总结: 第一步:安装rJava和jd ...
- NPOI处理Excel
using NPOI; using NPOI.XSSF.UserModel; using NPOI.SS.UserModel; using NPOI.HSSF.UserModel; NPOI.SS.U ...
- Android学习笔记4
activity配置文件 //AndroidMainifest.xml <?xml version="1.0" encoding="utf-8"?> ...
- 『德不孤』Pytest框架 — 2、Pytest的基本使用
目录 1.Pytest安装 2.Pytest常用插件 3.Pytest运行的第一个例子 4.Pytest框架的运行方式 5.在PyCharm中以Pytest的方式运行测试用例 1.Pytest安装 C ...
- Java Selenide 介绍&使用
目录 Selenide 介绍 官方快速入门 元素定位 元素操作 浏览器操作 断言 常用配置 Selenide 和 Webdriver 对比 Selenide 介绍 Selenide github Se ...
- golang中的排序算法实现
1. 冒泡排序算法实现 package main import "fmt" func main() { values := []int{3, 98, 55, 46, 22, 3, ...