\(\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_k\le\sum_{i=1}^{k-1}|f(v_i)|.
\]

因而

\[|f(u)|=\sum_{i=1}^{k}c_i\le\min\left\{2\sum_{i=1}^{k-1}|f(v_i)|,\sum_{i=1}^k|f(v_i)|\right\}.
\]

  最后,把问题放在全局,令 \(c_u\) 表示 \(u\) 对父亲的 contributor 数量,特别地,\(c_1=|f(1)|\);令 \(s_u\) 表示 \(u\) 的子树内所有叶子取值集合大小和,那么

\[\sum_uc_u=\sum_{u\text{ is not a leaf}}|f(u)|.
\]

根据结论:

\[\begin{aligned}
\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的更多相关文章

  1. Solution Set -「LOCAL」冲刺省选 Round XXV

    \(\mathscr{Summary}\)   读错题了读错题了 B 题差点没做出来真的太吓人了.   逆序开题,C 题直接冲一发暴力最大权闭合子图居然过了.A 题确实一下子没想到用"可能的 ...

  2. Solution Set -「LOCAL」冲刺省选 Round XXIV

    \(\mathscr{Summary}\)   名副其实的 trash round,希望以后没有了.   A 题算好,确实一个比较关键的简化状态的点没想到,所以只拿了暴力(不考虑 \(\mathcal ...

  3. Solution Set -「LOCAL」冲刺省选 Round XXII

    \(\mathscr{Summary}\)   和出题人很有缘分但是没有珍惜.jpg   A 题有一个显然的二维偏序斜率式,以及显然的 CDQ 套李超树 \(\mathcal O(n\log^2n)\ ...

  4. Solution Set -「LOCAL」冲刺省选 Round XXI

    \(\mathscr{Summary}\)   省选几个小时啊,怎么模拟赛只打三个小时啊./kk   时间安排较为合理,没有出现严重的因思考时间过少引起的丢分.   A 题比较可惜,二分 + 点分治大 ...

  5. Solution -「LOCAL」过河

    \(\mathcal{Description}\)   一段坐标轴 \([0,L]\),从 \(0\) 出发,每次可以 \(+a\) 或 \(-b\),但不能越出 \([0,L]\).求可达的整点数. ...

  6. Solution -「LOCAL」画画图

    \(\mathcal{Description}\)   OurTeam.   给定一棵 \(n\) 个点的树形随机的带边权树,求所有含奇数条边的路径中位数之和.树形生成方式为随机取不连通两点连边直到全 ...

  7. Solution -「LOCAL」充电

    \(\mathcal{Description}\)   给定 \(n,m,p\),求序列 \(\{a_n\}\) 的数量,满足 \((\forall i\in[1,n])(a_i\in[1,m])\l ...

  8. Solution -「LOCAL」二进制的世界

    \(\mathcal{Description}\)   OurOJ.   给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...

  9. Solution -「LOCAL」大括号树

    \(\mathcal{Description}\)   OurTeam & OurOJ.   给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...

随机推荐

  1. Go语言系列之反射

    变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指在程序运行期对程序本身进行访问和修改的能力.程序在编译时,变量 ...

  2. LINUX学习-Nginx服务器的反向代理和负载均衡

    一.准备环境 1.准备3台服务器: 1)192.168.88.10 --Nginx服务器 2)192.168.88.20 --apache服务器 3)192.168.88.30 --apache服务器 ...

  3. kafka学习笔记(七)kafka的状态机模块

    概述 这一篇随笔介绍kafka的状态机模块,Kafka 源码中有很多状态机和管理器,比如之前我们学过的 Controller 通道管理器 ControllerChannelManager.处理 Con ...

  4. ADD software version display

    ADD software version display ADD software version display1. Problem Description2. Analysis3. Solutio ...

  5. Spring系列2:Spring容器基本概念和使用

    本文内容 简单回顾IoC和DI概念 Spring容器的概念 的xml配置和初始化 容器的基本使用 bean的定义和初始化配置 简单理解IoC和DI概念 什么是IoC控制反转? 通俗地但不严谨地讲,以前 ...

  6. C 库函数 - pow()

    1.C 标准库 - <math.h> 2.C 库函数 double pow(double x, double y) 返回 x 的 y 次幂,即 xy. 3.pow() 函数的声明. dou ...

  7. Linuxqq shell脚本安装后的卸载

    官方下载和帮助页面: 传送门 linuxqq_2.0.0-b1 的时候,并没有发布 MIPS64 的 DEB 包,只能用 .sh 安装,需要手动删除卸载.愚人节发布的 beta2 新增了 MIPS64 ...

  8. c#操作符详解

    操作符概览 操作符(Operator)也译为"运算符" 操作符是用来操作数据的,被操作符操作的数据称为操作数(Operand) 操作符的本质 操作符的本质是函数(即算法)的&quo ...

  9. MySQL读写问题(锁)

    一.概述 读-读:并发不存在问题,不需要加锁 写-写:并发存在问题,可能会造成脏写(一个事务没有写完,另一个事务也对相同的数据进行写),但是这种情况,任何一种隔离级别都不允许发生,在隔离级别的时候就解 ...

  10. python 小兵(6)函数根据问题详解

    _list = []for i in range(3): def func(a): return i+a_list.append(func)for f in _list: print(f(1)) 首先 ...