参照 E_Space 的候选队论文,我们建出广义串并联图进行「删一度点」「缩二度点」「叠合重边」操作合并信息的表达式树。

我们把其描述成一颗 Leafy Tree。

我们不妨在每个叶节点处存一个点或者边,非叶节点处存一个算符 \(op\)。

每个非叶节点将根据其合并方式来决定其究竟表示一个点,还是表示一个边。

对于表示边的节点,我们可以用一个四维向量 \((A,B,C,D)'\) 描述之,表示左右点分别取 \(0/1\) 状态所对应的权值;注意左右不可交换。

对于表示点的节点,我们可以用一个二维向量 \((b,w)'\) 描述之(或者直接拓宽成 \((b,w,-\infty,-\infty)'\) 四维向量),表示其取两种方案是分别最大权。

合并操作不妨分为四种:「删一度点」「缩二度点」「叠合重边」「边序翻转」。

其中「边序翻转」操作用于把 \((u,v)\) 当作 \((v,u)\) 处理的情境。

建树过程可以通过 bfs 当前点类型实现。

对于四种操作,我们分别计算合并方式。

对当前 \(f,p,e=(f,p)\) 进行「删一度点」操作,其将合并为 \(f\)。

\[\begin{pmatrix}b_f\\w_f\end{pmatrix}\leftarrow\begin{pmatrix}\max\{b_f+b_p+A_e,b_f+w_p+B_e\}\\\max\{w_f+b_p+C_e,w_f+w_p+D_e\}\end{pmatrix}
\]

对当前 \(p,e_1=(u,p),e_2=(p,v)\) 进行「缩二度点」操作,其将合并为 \(e=(u,v)\)。

\[\begin{pmatrix}A_e\\B_e\\C_e\\D_e\end{pmatrix}\leftarrow\begin{pmatrix}\max\{A_{e_1}+b_p+A_{e_2},B_{e_1}+w_p+C_{e_2}\}\\\max\{A_{e_1}+b_p+B_{e_2},B_{e_1}+w_p+D_{e_2}\}\\\max\{C_{e_1}+b_p+A_{e_2},D_{e_1}+w_p+C_{e_2}\}\\\max\{C_{e_1}+b_p+B_{e_2},D_{e_1}+w_p+D_{e_2}\}\end{pmatrix}
\]

对当前 \(e_1=(u,v),e_2=(u,v)\) 进行「叠合重边」操作,其将合并为 \(e=(u,v)\)。

\[\begin{pmatrix}A_e\\B_e\\C_e\\D_e\end{pmatrix}\leftarrow\begin{pmatrix}A_{e_1}+A_{e_2}\\B_{e_1}+B_{e_2}\\C_{e_1}+C_{e_2}\\D_{e_1}+D_{e_2}\end{pmatrix}
\]

对当前 \(e=(v,u)\) 进行「边序翻转」操作,其将变为 \(e=(u,v)\)。

\[\begin{pmatrix}A_e\\B_e\\C_e\\D_e\end{pmatrix}\leftarrow\begin{pmatrix}A_e\\C_e\\B_e\\D_e\end{pmatrix}
\]

使用树剖,每次在矩阵中记录轻儿子的信息,进行重链信息合并,向链顶父亲传递信息。

容易构造转移矩阵。

这样子朴素实现单组询问是 \(O(\log^2n)\) 的,使用 GBT 等可以做到 \(O(\log n)\)。

代码实现。

loj3076的更多相关文章

  1. [loj3076]公园

    为了方便,对题意做以下处理: 1.称"西部主题"和"科幻主题"分别为黑色和白色 2.删去题中"保证没有两条不同的道路连接同一对景点"的条件 ...

随机推荐

  1. Python + logging 控制台有日志输出,但日志文件中数据为空

    源码: def output(self, level, message): fh = logging.FileHandler(self.logpath, mode='a', encoding='utf ...

  2. JavaScript:操作符:正负号和自增自减及其隐式转换数据类型

    正负号 正号即加号,负号即减号,运算结果同数学意义一样: 对非数字类型进行正负号运算,会隐式转换为数字,再进行运算: 一些特殊的非数字,转换情况同算术运算符: 自增自减 自增即为++,自减即为--. ...

  3. DSS+Linkis Ansible 单机一键安装脚本

    DSS+Linkis Ansible 单机一键安装脚本 一.简介 为解决繁琐的部署流程,简化安装步骤,本脚本提供一键安装最新版本的DSS+Linkis环境:部署包中的软件采用我自己编译的安装包,并且为 ...

  4. @Data加在子类上,子类无法获取父类的属性

    1.问题描述 我的子类继承父类,并在子类上加了@Data注解.但在程序运行时,输出的结果只有我在子类中定义的属性,父类的属性没有输出. 这是我定义的子类: 这个是子类继承的父类: 这个是输出结果: 可 ...

  5. [机器学习] sklearn聚类

    聚类(Clustering)简单来说就是一种分组方法,将一类事物中具有相似性的个体分为一类,将另一部分比较相近的个体分为另一类.例如人和猿都是灵长目动物,但是根据染色体数目不同可以将人和猿分类不同的两 ...

  6. Windows 平台计算 CPU 总利用率

    利用 GetSystemTimes 可以获得 Windows 系统的 Idle Time. Kernel Time 和 User Time.Idle Time 是系统空闲的时间,也就是系统没有利用的时 ...

  7. Git操作不规范,战友提刀来相见!

    年终奖都没了,还要扣我绩效,门都没有,哈哈. 这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家. 文末留言,聊聊你的年终奖. 问题描述 小A和我在同时开发一个功能模 ...

  8. JavaScript 中URL 查询字符串(query string)的序列与反序列化

    方法一: 在 JavaScript 中,可以使用 URLSearchParams 对象来处理 URL 中的查询字符串. 序列化(将 JavaScript 对象转换为查询字符串)可以使用 URLSear ...

  9. UVA12412 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang) 代码

    #include <bits/stdc++.h> #define int long long #define judge(a,func) case a:func();break; usin ...

  10. Node.js+Koa2+TypeScript技术概览

    最近几年一直使用Node.js作为后端服务平台,通过Koa2框架中间件快速搭建Web服务,但是使用JavaScript开发大型后端服务时会使程序变得难以维护,继而使用TypeScript语言开发,使编 ...