虚树

虚树是用来优化树形dp的东西,它的转移是从一些特殊点,向根节点转移,期间它有用的转移点比较特殊。通常询问次数较多,但特殊点总和较少,就可以每次询问先建虚树再跑dp。单调栈建虚树 O ( k l o g n ) O(klogn) O(klogn) k k k为特殊点数, n n n为原树上点数

虚树的点数为特殊点两倍

单调栈构造虚树,强制根节点为1(或者先加入dfs最小的特殊点),便于统计答案

void build(){std::sort(a+1,a+1+m,[&](int i,int j){return dfn[i]<dfn[j];});int top=0;cnt=0;stk[++top]=1;head[1]=0;//顺便清空之前的虚树,也可以直接遍历一遍虚树清除for (int i=1;i<=m;i++){if (a[i]!=1){//全程不用管top大小int lc=lca(stk[top],a[i]);if (lc!=stk[top]){//当前节点已不再当前栈维护的链上while (dfn[lc]<dfn[stk[top-1]]){//一直跳出,并添加已经确定的边add(stk[top-1],stk[top],0);top--;}if (dfn[lc]>dfn[stk[top-1]]){//lc之前没有加入到栈中head[lc]=0;add(lc,stk[top--],0);stk[++top]=lc;}else{//lc加入过栈add(lc,stk[top--],0);}}//最后只要把a[i]加入该链head[a[i]]=0;stk[++top]=a[i];}}for (int i=1;i<top;i++){add(stk[i],stk[i+1],0);//将链上的节点依次建边}
}

P2495 [SDOI2011] 消耗战
正常的每次询问跑一边树形dp时间爆炸,所以直接建虚树跑树形dp,在原树上要维护一个点 x x x 到根节点的最小断边 f x f_x fx。转移直接分情况:
当前点为特殊点,必须将 u u u分离出来, d p u = f u dp_u=f_u dpu=fu
当前点不为特殊点,可以将 u u u直接分离,或者让 u u u从其已经分离的子树分离, d p u = m i n ( f u , ∑ d p v ) dp_u=min(f_u,\sum dp_v) dpu=min(fu,dpv)

CF613D Kingdom and its Cities
如果有一条边连接的都是重要城市,输出-1
建完虚树,比较暴力的跑就是 d p u , 0 / 1 dp_{u,0/1} dpu,0/1表示 u u u子树合法,与 u u u连通的块中无/有一个特殊点,所需的最小代价
对于 u u u为特殊点,很显然只能转移到 d p u , 1 dp_{u,1} dpu,1,和孩子节点全分开
d p u , 1 = ∑ ( m i n ( d p v , 0 , d p v , 1 ) + 1 ) dp_{u,1}=\sum (min(dp_{v,0},dp_{v,1})+1) dpu,1=(min(dpv,0,dpv,1)+1)
对于 u u u不为特殊点, d p u , 0 dp_{u,0} dpu,0转移同上
d p u , 1 dp_{u,1} dpu,1就是特意留下一个 d p v , 1 dp_{v,1} dpv,1转移过来且不断开(这里转移就很不好搞了)

我们发现一个贪心性质,就是能留特殊点,就尽量留下来,所以我们就可以省一维,然后多开一个数组 f u f_u fu来存储包含 u u u的连通块是否包含特殊点,等到向父亲传递转移时,迫不得已再断开

CF1111E Tree
先按照原树dfs序建虚树(根节点不再是1,选择特殊点中dfs序最小的那个,一定要加入 r r r),然后换虚树根跑dp
dp状态部分很平常,因为它是分了组的,联想到第二类斯特林的递推式。

d p u , j = ( j − b a d u ) ∗ d p u , j + d p u , j − 1 dp_{u,j}=(j-bad_u)*dp_{u,j}+dp_{u,j-1} dpu,j=(jbadu)dpu,j+dpu,j1 b a d u bad_u badu表示根节点到 u u u路径上特殊点个数
放入已有组,或新开一个组单独放入,遍历顺序我们只需保证在遍历到 u u u时, b a d u bad_u badu已经求出来了即可,常规dfs就可以了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/37106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

别人直播的时候怎么录屏?分享一些录屏方法

​随着互联网的快速发展&#xff0c;直播已经成为人们日常生活中不可或缺的一部分。但是&#xff0c;有时候我们可能会错过某些重要的直播内容&#xff0c;这时候就需要录屏来保存和观看。那么&#xff0c;如何录屏别人的直播呢&#xff1f;本文将分享一些录屏方法和技巧&#…

【Python机器学习】实验11 神经网络-感知器

文章目录 人工神经网络感知机二分类模型算法 1. 基于手写代码的感知器模型1.1 数据读取1.2 构建感知器模型1.3 实例化模型并训练模型1.4 可视化 2. 基于sklearn的感知器实现2.1 数据获取与前面相同2.2 导入类库2.3 实例化感知器2.4 采用数据拟合感知器2.5 可视化 实验1 将上面数…

SpringBoot复习:(50)TransactionManager是哪里来的?是什么类型的?

运行结果&#xff1a; 可见它的类型是DataSourceTransactionManager.它是通过自动配置创建的。

rust怎么做大型项目管理?学好cargo和mod是关键

一提到大型项目开发&#xff0c;大家都会以Java作为标准&#xff0c;为什么呢&#xff1f; 一个是Java生态有很多以Maven为代表的成熟的项目管理工具&#xff0c;另一个是基于package的模块管理模式&#xff0c;提供了非常好的功能内聚和模块间解耦&#xff0c;而同样的rust也有…

PHP先等比缩放再无损裁剪图片【实例源码】

很多人在使用程序裁剪图片时,是在原图上直接裁剪,这样的裁剪结果是使得图片变得不完整了,理想的做法是先等比缩小图片,再把多余的部分裁掉,这样会保留更多的图片信息。 实现代码: <?php/*** 说明:函数功能是把一个图像裁剪为任意大小的图像,图像不变形** @param …

类型转换与索引使用与字段缓存问题

** 1: 类型转换与索引使用** 假设你有一个MySQL表格 users&#xff0c;其中有一个 age 列&#xff0c;数据类型是整数&#xff08;INT&#xff09;&#xff0c;并且为该列创建了一个索引。然后你执行以下查询&#xff1a; sqlCopy code SELECT * FROM users WHERE age 25;在…

pdf怎么压缩?一分钟学会文件压缩方法

PDF文件过大一般主要原因就是内嵌大文件、重复的资源或者图片比较多&#xff0c;随之而来的问题就是占用存储空间、被平台限制发送等等&#xff0c;这时候我们可以通过压缩的方法缩小PDF文件大小&#xff0c;下面就一起来看看具体的操作方法吧。 方法一&#xff1a;嗨格式压缩大…

【系统架构设计专业技能 · 软件工程之系统分析与设计(二)【系统架构设计师】

系列文章目录 系统架构设计专业技能 软件工程&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;…

vue+element多层表单校验prop和rules

核心点&#xff1a;外层循环是item和index&#xff0c;内层循环是item2和index2 如果都是定义的同一个属性名 外层循环得写:prop"block.index.numerical" 同理内层循环就得写:prop"objectSpecs. index2 .numerical" 校验函数方法 :rules"getRules(it…

机器学习之分类模型

机器学习之分类模型 概述分类模型逻辑回归最近邻分类朴素贝叶斯支持向量机决策树随机森林多层感知机基于集成学习的分类模型VotingBaggingStackingBlendingBoosting 概述 机器学习分类模型通过训练集进行学习&#xff0c;建立一个从输入空间 X X X到输出空间 Y Y Y&#xff08…

推断统计(独立样本t检验)

这里我们是采用假设检验中的独立样本t 检验来比较两个独立正态总体均值之间是否存在显著性差异&#xff0c;以比较城市与农村孩子的心理素质是否有显著差异为例 。 这里我们首先是假设城市孩子与农村孩子心理素质无显著差异&#xff0c;但是此时方差是否齐性是未知的&#xff0…

题目:2566.替换一个数字后的最大差值

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2566. 替换一个数字后的最大差值 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 将从左到右第一个非 9 数字全部修改为 9 以得到最大值。将从左到右第一个数字全部修改为 0 以得到最小值&a…

c#实现命令模式

下面是一个使用C#实现命令模式的示例代码&#xff1a; using System; using System.Collections.Generic;// 命令接口 public interface ICommand {void Execute();void Undo(); }// 具体命令&#xff1a;打开文件 public class OpenFileCommand : ICommand {private FileMana…

【MySQL】MySQL不走索引的情况分析

未建立索引 当数据表没有设计相关索引时&#xff0c;查询会扫描全表。 create table test_temp (test_id int auto_incrementprimary key,field_1 varchar(20) null,field_2 varchar(20) null,field_3 bigint null,create_date date null );expl…

ffmpeg命令行是如何打开vf_scale滤镜的

前言 在ffmpeg命令行中&#xff0c;ffmpeg -i test -pix_fmt rgb24 test.rgb&#xff0c;会自动打开ff_vf_scale滤镜&#xff0c;本章主要追踪这个流程。 通过gdb可以发现其基本调用栈如下&#xff1a; 可以看到&#xff0c;query_formats&#xff08;&#xff09;中创建的v…

Unity框架学习--2

接上文 IOC 容器是一个很方便的模块管理工具。 除了可以用来注册和获取模块&#xff0c;IOC 容器一般还会有一个隐藏的功能&#xff0c;即&#xff1a; 注册接口模块 抽象-实现 这种形式注册和获取对象的方式是符合依赖倒置原则的。 依赖倒置原则&#xff08;Dependence I…

maven install

maven install maven 的 install 命令&#xff0c;当我们的一个 maven 模块想要依赖其他目录下的模块时&#xff0c;直接添加会找不到对应的模块&#xff0c;只需要找到需要引入的模块&#xff0c;执行 install 命令&#xff0c;就会将该模块放入本地仓库&#xff0c;就可以进…

Linux tar包安装 Prometheus 和 Grafana(知识点:systemd Unit/重定向)

0. 介绍 用tar包的方式安装 Prometheus 和 Grafana Prometheus:开源的监控方案Grafana:将Prometheus的数据可视化平台 Prometheus已经有了查询功能为什么还需要grafana呢?Prometheus基于promQL这一SQL方言,有一定门槛!Grafana基于浏览器的操作与可视化图表大大降低了理解难…

Vue3 setup tsx 子组件向父组件传值 emit

需求&#xff1a;Vue3 setup 父组件向子组件传值&#xff0c;子组件接收父组件传入的值&#xff1b;子组件向父组件传值&#xff0c;父组件接收的子组件传递的值。 父组件&#xff1a;parent.tsx&#xff1a; import { defineComponent, ref, reactive } from vue; import To…

【Android】okhttp爆java.lang.IllegalStateException: closed的解决方法

解决 java.lang.IllegalStateException: closed异常通常是由于OkHttp中的Response对象在调用response.body().string()后被关闭而导致的。 在代码中&#xff0c;在onResponse()方法中如果两次调用了response.body().string()&#xff0c;每次调用都会消耗掉响应体并关闭Respo…