【换根DP】生活在树上

news2024/9/20 16:25:22

换根DP板子题 

D-生活在树上_牛客小白月赛46 (nowcoder.com)

题意:

思路:

看数据范围是1e6且是统计问题,求的是对于每一个点的统计问题,那就逃不出是换根DP了

首先dfs1一次把树形DP求出来,然后再考虑换根

设dp[u][j]为以u为根的子树中,离根u的距离是j的结点个数

这个很容易转移,但是注意要对边权分类讨论

然后考虑换根,换根的时候注意是从上到下更新dp数组

是根据u结点的dp值和v的dp值更新儿子结点的dp2值,即dp2[v]=...dp[u]+....的形式

Code:

#include <bits/stdc++.h>

#define int long long

using namespace std;

using i64 = long long;

const int mxn=1e6+10;
const int mxe=1e6+10;
const int mod=1e9+7;

struct ty{
    int to,next,w;
}edge[mxe<<2];

int N,Fa,d,tot=0;
int head[mxn],dp[mxn][3];

void add(int u,int v,int w){
    edge[tot].w=w;
    edge[tot].to=v;
    edge[tot].next=head[u];
    head[u]=tot++;
}
void G_init(){
    tot=0;
    for(int i=0;i<=N;i++){
        head[i]=-1;
    }
}
void dfs1(int u,int fa){
    dp[u][0]=1;
    dp[u][1]=dp[u][2]=0;
    for(int i=head[u];~i;i=edge[i].next){
        if(edge[i].to==fa) continue;
        dfs1(edge[i].to,u);
        if(edge[i].w==1){
            dp[u][1]+=dp[edge[i].to][0];
            dp[u][2]+=dp[edge[i].to][1];
        }else if(edge[i].w==2){
            dp[u][1]+=0;
            dp[u][2]+=dp[edge[i].to][0];
        }
    }
}
void dfs2(int u,int fa){
    for(int i=head[u];~i;i=edge[i].next){
        if(edge[i].to==fa) continue;
        if(edge[i].w==1){
            dp[edge[i].to][1]+=dp[u][0];
            dp[edge[i].to][2]+=dp[u][1]-1;
        }else if(edge[i].w==2){
            dp[edge[i].to][2]+=dp[u][0];
        }
        dfs2(edge[i].to,u);
    }
}
void solve(){
    cin>>N;
    G_init();
    for(int i=2;i<=N;i++){
        cin>>Fa>>d;
        add(i,Fa,d);
        add(Fa,i,d);
    }
    dfs1(1,-1);
    dfs2(1,-1);
    for(int i=1;i<=N;i++) cout<<dp[i][0]+dp[i][1]+dp[i][2]<<'\n';
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int __=1;//cin>>__;
    while(__--)solve();return 0;
}

但是注意dfs2不能写成如下形式:

void dfs2(int u,int fa){
    dp2[u][0]=1;
    for(int i=head[u];~i;i=edge[i].next){
        if(edge[i].to==fa) continue;
        if(edge[i].w==1){
            dp2[edge[i].to][1]=dp[edge[i].to][1]+dp[u][0];
            dp2[edge[i].to][2]=dp[edge[i].to][2]+dp[u][1]-1;
        }else if(edge[i].w==2){
            dp2[edge[i].to][1]=dp[edge[i].to][1];
            dp2[edge[i].to][2]=dp[edge[i].to][2]+dp[u][0];
        }
        dfs2(edge[i].to,u);
    }
}

因为父节点被不断更新,这里加上的应该是被更新过的父节点的dp值!

所以在写换根DP的时候,不能另开一个数组,而是累加

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

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

相关文章

Wireshark抓包分析(ARP TCP DNS HTTP)

目录 一、ARP 二、DNS 三、TCP TCP的总过程&#xff1a; ​TCP三次握手&#xff1a; TCP四次挥手&#xff1a; 四、HTTP 一、ARP 1.ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根据IP地址获取物理地址的一个TCP/IP协议。 我们要抓ARP 同网段内…

(学习日记)2023.06.15

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

0003-TIPS-2020-hxp-kernel-rop : bypass-KPTI-with-trampoline

KPTI KPTI描述内容摘录自ctf wiki KPTI 机制最初的主要目的是为了缓解 KASLR 的绕过以及 CPU 侧信道攻击。 在 KPTI 机制中&#xff0c;内核态空间的内存和用户态空间的内存的隔离进一步得到了增强。 内核态中的页表包括用户空间内存的页表和内核空间内存的页表。 用户态的页…

minikube 试炼

点我进入 minikube 试炼 今天我们先来尝试使用一下 minikube &#xff0c;可以进入到 https://kubernetes.io/zh/docs/tutorials/hello-minikube/ 页面上直接感受&#xff0c;或者通过如下指令&#xff0c;将 minikube 放入我们的服务器上面进行使用 简单安装 minikube Linu…

在Centos Stream 9上Docker的实操教程(六) - Docker Compose容器编排详解

在Centos Stream 9上Docker的实操教程 - Docker Compose容器编排详解 前言什么是Docker-Compose下载安装和卸载使用仓库安装手动安装卸载 docker compose常用命令项目实战构建SpringBoot项目编写Dockerfile文件编写Docker-Compose.yml文件 运行测试相关注意事项结语 前言 在了…

使用Pyinstall将PyQT5工程打包成.exe应用程序(包含图标一同打包)

1.首先安装pyinstaller。 pip install pyinstaller 2.PyQT5制作程序中使用到的ico等一系列图标文件&#xff0c;要先经过.qrc文件转成.py文件后&#xff0c;才可跟随打包文件一同打包。 首先创建一个.qrc文件&#xff0c;将图片文件全部写进去&#xff0c;例如: <RCC>&…

selenium 调用本地浏览器插件

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!selenium 使用本地浏览器插件 环境 win10Python3.9selenium 4.10查看chrome配置文件路径 地址栏输入 ​​…

Python 请求分页

文章目录 什么是 Python 中的分页带有下一个按钮的 Python 分页没有下一个按钮的 Python 分页无限滚动的 Python 分页带有加载更多按钮的分页 在本文中&#xff0c;我们将了解分页以及如何克服 Python 中与分页相关的问题。 读完本文后&#xff0c;我们将能够了解 Python 分页以…

TensorHouse仓库介绍

目录 1 TensorHouse介绍 2 说明性例子 3模型列表 4基本组件 5方法 6参考 7后续计划 1 TensorHouse介绍 代码仓库&#xff1a;GitHub - ikatsov/tensor-house: A collection of reference machine learning and optimization models for enterprise operations: marketi…

插入排序-C语言实现

&#x1f970;前言 &#x1f354;在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据&#xff0c;当然操作数据首先想到的就是数据的排序&#xff0c;排过顺序的数据的使用价值才够大。前面我们学习了顺序表也学习了链表等等&#xff0c;这些就是储存数据的方…

哲学家就餐问题

哲学家就餐问题是一个著名的一类同步问题&#xff0c;在并发编程领域&#xff0c;常用来解释线程同步的问题。 问题描述&#xff1a;五位哲学家围坐在一张圆桌旁&#xff0c;每个哲学家面前有一碗米饭和一只筷子。这五个哲学家都是苦于无法同时持有两只筷子&#xff0c;因为只…

Autosar软件组件-Application Layer介绍和SWC(Software Component)类型

参考前文Autosar-软件架构,可知整个架构从上到下分层依次为:应用层(Application Software Layer),运行时环境(Runtime Environment,RTE),基础软件层(Basic Software Layer,BSW),微控制器(Microcontroller)。 Application Layer由各种AUTOSAR Software Componen…

【备战秋招】每日一题:华东师范大学保研机试-2022-整数排序

为了更好的阅读体检&#xff0c;可以查看我的算法学习博客华东师范大学保研机试-2022-整数排序 题目内容 输入若干个int类型整数&#xff0c;将整数按照位数由大到小排序&#xff0c;如果位数相同&#xff0c;则按照整数本身从小到大排序。 例如, 输入:10 -3 1 23 89 100 9…

【第四次】21级计科计算机组成原理课外练习

【第四次】21级计科计算机组成原理课外练习 一、判断题二、单选题三、多选题四、填空题五、程序填空题 一、判断题 1-1 设机器数字长8位&#xff08;含1位符号位&#xff09;&#xff0c;若机器数BAH为原码&#xff0c;算术右移一位得到的结果为 9D H 。 T F 1-2 ALU中采用双…

spring 反射,BigDecimal,自定义注解的使用(aop)

反射 利用反射调用它类中的属性和方法时&#xff0c;无视修饰符。 获取Class类的对象&#xff08;三种方式&#xff09; Class.forName(“全类名”) &#xff08;推荐使用&#xff09;类名.class对象.getClass() 反射获取构造方法Constructor<?>[] getConstructors()…

Android 逆向之脱壳实战篇

作者&#xff1a;37手游安卓团队 前言 这篇文章比较干&#xff0c;比较偏实战&#xff0c;看之前建议先喝足水&#xff0c;慎入。 在学脱壳之前&#xff0c;我们先来复习一下&#xff0c;什么时候是加固&#xff1f; 加固本质上就是对 dex 文件进行加壳处理&#xff0c;让一些…

信号三大阶段之储存信号

目录 一、 信号三大阶段 二、信号储存相关概念 三、 理解概念 四、信号储存原理 五、信号集操作函数 一、 信号三大阶段 二、信号储存相关概念 实际执行信号的过程被称为信号递达&#xff08;Delivery&#xff09;。信号从产生到递达之间的状态被称为信号未决&#xff08;…

【Linux】初步认识Linux系统

Linux 操作系统 主要作用是管理好硬件设备&#xff0c;并为用户和应用程序提供一个简单的接口&#xff0c;以便于使用。 作为中间人&#xff0c;连接硬件和软件 常见操作系统 桌面操作系统 WindowsmacOsLinux 服务器操作系统 LinuxWindows Server 嵌入式操作系统 Linux …

从零搭建一台基于ROS的自动驾驶车-----1.整体介绍

系列文章目录 北科天绘 16线3维激光雷达开发教程 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图 Nvidia Jetson Nano学习笔记–串口通信 Nvidia Jetson Nano学习笔记–使用C语言实现GPIO 输入输出 Autolabor ROS机器人教程 文章目录 系列文章目录前言一、小车底盘二、激…

Redis入门(三)

第5章 Redis的相关配置(redis.conf) 1&#xff09;计量单位说明,大小写不敏感 # 1k > 1000 bytes # 1kb > 1024 bytes # 1m > 1000000 bytes # 1mb > 1024*1024 bytes # 1g > 1000000000 bytes # 1gb > 1024*1024*1024 bytes # # units are case insensiti…