参照 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. excel甘特图制作

    1.插入图表   1 1.选中数据区域(3列,如图所示)--点击插入--推荐的图表--堆积条形图 END 2.甘特图制作   1 2.点击图表工具--设计--选择数据. 轴标签区域改为--确定项目.. ...

  2. 带你读AI论文丨针对文字识别的多模态半监督方法

    摘要:本文提出了一种针对文字识别的多模态半监督方法,具体来说,作者首先使用teacher-student网络进行半监督学习,然后在视觉.语义以及视觉和语义的融合特征上,都进行了一致性约束. 本文分享自 ...

  3. JavaScript:代码细节和良好编码习惯

    这些细节,与语法无关,仅仅是编写代码时需要注意的最最基本的细节和一些良好编码习惯. 注释代码 注释代码分为单行注释和多行注释,如下所示: 严格区分大小写 JS的代码时严格区分大小写的,变量a和A是不同 ...

  4. ubuntu系统wireshark源码编译与安装

    官网:https://www.wireshark.org/ 官方文档:Wireshark · Documentation 一 介绍 wireshark[1]是一款抓包工具.wireshark的GUI( ...

  5. 2、Navicat安装提示报错

    问题描述:激活navicat15的注册码时报出"rsa public key not find"错误原因:没有生成破解版的RegPrivateKey.pem文件解决方案:重新安装N ...

  6. ArcGIS工具 - 导出空数据库

    有时,需要根据已有的成果数据创建一个空的数据库模板文件,用于新的编辑或对外发布.那么,如果又快又好的创建呢?为源GIS为您编写了一个导出空数据库工具,它可以实现"一键"快速导出任意 ...

  7. python之路49 模板层标签 自定义过滤器 模板继承、模型层准备、ORM部分操作

    模板层之标签 {% if 条件1(可以自己写也可以是用传递过来的数据) %} <p>周三了 周三了</p> {% elif 条件2(可以自己写也可以用传递过来的数据) %} & ...

  8. Nodejs后端自动化测试

    偶然看到收藏一下 const puppeteer = require('puppeteer'); const fs = require('fs'); (async () => { const b ...

  9. 商城网站商品sku选择的js简易实现

    商城网站商品sku选择的js简易实现 <!DOCTYPE HTML> <html lang="en-US"> <head> <meta c ...

  10. Qt添加自定义控件

    由于在自带的控件中没有发现滚动选择时间的控件,所以参考网上别人写的控件做了一点修改. 先看效果: 上代码: TimeScroll.h QT_BEGIN_NAMESPACE namespace Ui { ...