参照 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. uniapp 微信小程序-点击图片放大图片

    <view class="pij-cont-imgbox" v-if='item.images.length>0'> <view class="p ...

  2. cs231n学习笔记——lecture6 Training Neural Networks

    该博客主要用于个人学习记录,部分内容参考自:[基础]斯坦福cs231n课程视频笔记(三) 训练神经网络.[cs231n笔记]10.神经网络训练技巧(上).CS231n学习笔记-训练神经网络.整理学习之 ...

  3. VuePress个人博客搭建

    vuepress概述 VuePress 由两部分组成:第一部分是一个极简静态网站生成器 (opens new window),它包含由 Vue 驱动的主题系统和插件 API,另一个部分是为书写技术文档 ...

  4. 基于Linux下的Ubuntu操作系统常用命令

    一 .linux操作系统的特点 1.linux下一切皆文件 2.linux系统就像一个倒置数 3.linux系统支持多用户.多任务 二. Ubuntu --"乌班图"操作系统 Ub ...

  5. Hadoop生态元数据管理平台——Atlas2.3.0发布!

    大家好,我是独孤风. 今天我们来聊一下另一个元数据管理平台Apache Atlas.Atlas其实有一些年头了,是在2015年的时候就开源. 相对于Datahub来说,Atlas显得有一些" ...

  6. [LeetCode]对角线遍历

    题目 代码 class Solution { public: vector<int> findDiagonalOrder(vector<vector<int>>&a ...

  7. 如何理解scanf(“%d %d”,a,b)==2和scanf(“%d”,a)=1【摘抄笔记ψ(._. )>】

    scanf 函数有一个返回值,0表示接受输入失败,1表示接受输入成功. while(scanf("%d",&x)==1) 的意思就是: 当接收输入变量x的值成功的时候,继续 ...

  8. Lock锁-线程状态概述

    Lock锁 java.util.concurrent.locks.Lock机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作,同步代码块/同步方法具有的功能Loc ...

  9. 如何找到CSDN中关注的用户和粉丝?

    如何找到CSDN中关注的用户和粉丝? 刚刚在CSDN个人账号里找了半天都没找到自己关注的人 对CSDN的页面更新感到很迷, 个人账号管理很不人性化, 或者说是根本找不到自己关注的用户以及关注自己的粉丝 ...

  10. immutable.js学习笔记(二)----- List

    一.List list与数组是兼容的,大多数的api与数组是类似的 注意 List.of(),不需要写中括号 二.List的API (一)size:取得 List 的长度 (二)set:设定指定下标的 ...