首页 > 其他分享 >换根dp

换根dp

时间:2023-10-12 15:24:22浏览次数:27  
标签:sz ch int MX 换根 dp

看到网上的方法多多少少比较复杂,所以决定写一下。

首先对于一道换根dp题应该是先要会不换根版本的。

然后可以按照欧拉序(括号序)换根。对于欧拉序中相邻的两个节点必有一条边把它们相连,所以换根的时候只需要从新统计 \(1\) 个子树的信息。

觉得自己的语言表达能力太烂,还是上题目比较好。

P3478 [POI2008] STA-Station

求一个点的应该很好做,考虑 \(f_u\) 表示点 \(u\) 的子树中的答案,\(sz_u\) 为 \(u\)的子树大小,有转移方程:

\[f_u=\sum_{v \in ch}(f_v+sz_v) \]

考虑如何进行换根。

假如把 \(v\) 换成新的根,结果如下

可以发现,只有 \(rt\) 与 \(v\) 的信息改变了,所以将 \(rt\) 减去 \(v\) 的贡献,\(v\)
加上 \(rt\) 的贡献即可。

code:

#include<vector>
#include<iostream>
using namespace std;

#define ll long long

const int MX=2e6+7;

vector<int > g[MX];
ll sz[MX],f[MX],ans=0;
int n,x,y,pos=0;

int read(){
	int x=0,ch=getchar();
	while(!(ch>=48&&ch<=57))ch=getchar();
	while(ch>=48&&ch<=57)x=x*10+ch-48,ch=getchar();
	return x;
}

void write(int x){
	if(x>9)write(x/10);
	putchar(x%10+48);
}

void dp(int x,int fa){
	sz[x]=f[x]=0;
	for(int i=0;i<g[x].size();i++){
		int to=g[x][i];
		if(to==fa)continue;
		dp(to,x);
		sz[x]+=sz[to];
		f[x]+=f[to]+sz[to];
	}
	sz[x]++;
}

void chg_rt(int rt,int newrt){
	f[rt]-=f[newrt]+sz[newrt];
	sz[rt]-=sz[newrt];
	f[newrt]+=f[rt]+sz[rt];
	sz[newrt]+=sz[rt];
	if(f[newrt]>ans){
		ans=f[newrt];
		pos=newrt;
	}
}

void dfs(int x,int fa){
	for(int i=0;i<g[x].size();i++){
		int to=g[x][i];
		if(to==fa)continue;
		chg_rt(x,to);
		dfs(to,x);
		chg_rt(to,x);
	}
}

int main(){
	ios::sync_with_stdio(false);
	n=read();
	for(int i=1;i<n;i++){
		x=read();
		y=read();
		g[x].push_back(y);
		g[y].push_back(x);
	}
	dp(1,1);
	dfs(1,1);
	write(pos);
	return 0;
}

CF708C Centroids

直接换根dp,不写了。

标签:sz,ch,int,MX,换根,dp
From: https://www.cnblogs.com/HJY2023/p/17759560.html

相关文章

  • 数字预失真(DPD)小试
    前言射频功放的增益响应并非线性的,受到放大管饱和效应的影响,功放不可避免地出现非线性、甚至具有记忆效应的失真。这种非线性失真不仅产生高阶谐波,还会产生互调干扰,降低带内信噪比,影响带外信号。因此,需要一种方式减弱射频功放的非线性增益,数字预失真就是方式之一。ADI有篇文章不......
  • Blazor Server App Cannot find the fallback endpoint specified by route values
    github官方issues中提到的解决方案,CreateBuilder时指定项目绝对路径可以解决。1//指定项目路径,也可以用Assembly.GetCallingAssembly获取2conststringContentRootPath=@"C:\Users\BlazorServer";//项目的路径3conststringApplicationName=nameof(BlazorServer);......
  • 网络基础-OSI七层vsTCP/UDP四层 五层 数据封装
    1.0网络基础1.1网络是什么?网络是信息传输、接收、共享的虚拟平台,通过它把各个点、面、体的信息联系到一起,从而实现这些资源的共享网络分类:局域网,城域网,广域网1.2数据通信方式单播:一对一组播:一对多广播:一对所有2.0OIS七层模型vsTCP/IP四层五层模型 2.1分层思想①......
  • 一些对dp突然的理解
    突然想到了一些理解,感觉有些模糊,怕忘记,就赶紧记下来就是对于状态的设计用01背包举例子吧,我们设计状态的时候一定是要保证所有可能在最后优秀的子状态在前面的时候是能够保留下来的也就是我们的状态设计要能够保留那些在最后优秀但是现在可能不优秀的情况,而不是一味的追求最优子结......
  • 《算法学习专栏》—— DP问题之背包模型
    2023年10月11日更新于2023年10月11日一、前言本栏,为背包模型,题目主要来源日常,目前主要来源于Acwing的提高课。希望以后做到背包的题目,也能加进来,不断完善。使用的分析方法均为闫式DP分析法。字臭。。。希望能用手写板慢慢写的好看。二、背包模型2.1目前的模型01背包模型......
  • C++ - UDP通信
    1.UDP通信流程UDP就比较简单了,步骤比tcp要少一些。连接过程图:  1.1服务器1.初始化套接字库WORDwVersion;WSADATAwsaData;interr;​wVersion=MAKEWORD(1,1);2.创建套接字SOCKETsockSrv=socket(AF_INET,SOCK_DGRAM,0);3.绑定//SOCKADDR_INaddrSrv......
  • DPDK-22.11.2 [四] Virtio_user as Exception Path
    因为dpdk是把网卡操作全部拿到用户层,与原生系统驱动不再兼容,所以被dpdk接管的网卡从系统层面(ipa/ifconfig)无法看到,同样数据也不再经过系统内核。如果想把数据再发送到系统,就要用到virtiouser。这种把数据从dpdk再发送到内核的步骤,就叫做exceptionpath。有关virtiouser,又有一......
  • WordPress网站被黑怎么办?【含解决方案】
    在我们的日常WordPress主题售后工作中,经常会有用户反馈网站出现问题,例如:阿里云提示后门木马文件;打开后跳转到其他地址;页面出现乱码;被添加了其他内容等,根据我们的经验,这种一般都是网站被黑导致的。 如何确认网站是否被黑根据以往经验,可以通过以下方式来判断:1、如果是阿里云提......
  • dotnet 8 WPF 支持在 RDP 远程桌面状态下启用渲染硬件加速
    本文将和大家介绍在dotnet8里WPF引入的新功能之一,在RDP远程桌面状态下启用渲染硬件加速在dotnet8之前,在用户进行RDP远程桌面时WPF应用将默认关闭硬件渲染加速以获得更好的兼容性。随着系统层的渲染架构的优化,比如在WDDM驱动模型里面,进行远程桌面的硬件加速已经是......
  • 《算法学习专栏》——DP问题之线性DP
    2023年10月10日更新于2023年10月10日一、前言本栏,为线性DP,题目主要来源日常,目前主要来源于Acwing的提高课。希望以后做到线性DP的题目,也能加进来,不断完善。二、线性DP2.1目前的模型:数字三角形模型最长上升子序列模型2.2目前解决的问题:可以解决路径上的各种值。解决......