首页 > 其他分享 >虚数学习笔记

虚数学习笔记

时间:2024-04-08 19:35:20浏览次数:25  
标签:cnt Min int 笔记 学习 Maxdep 虚数 dp 关键点

虚树

详见 OI-Wiki

其实就是把原树浓缩成 \(k_i\) 数量级的小树,题目会保证 \(\sum k_i\) 和 \(n\) 同阶,于是每次询问暴力 dp 就是对的了。

但是 OI-Wiki 并未提到为什么 dp 用到的所有点是关键点本身和排完序后每相邻两个关键点的 LCA 呢?

证明

虚树的建立:

il bool cmp(int a,int b){ 
	return id[a]<id[b]; 
} 
il void build(){ 
	t[++num]=1; 
	sort(a+1,a+k+1,cmp); 
	for(int i=1;i<k;i++){ 
		t[++num]=a[i]; 
		t[++num]=LCA(a[i],a[i+1]); 
	} t[++num]=a[k]; 
	sort(t+1,t+num+1,cmp); 
	num=unique(t+1,t+num+1)-t-1; 
	for(int i=1;i<num;i++) vec[LCA(t[i],t[i+1])].push_back(t[i+1]); 
} 

P2495 [SDOI2011] 消耗战

板子题。

考虑暴力:设 \(dp_u\) 表示使 \(u\) 子树内所有关键点都与 \(1\) 断开的最小代价,令 \(Min_u\) 表示 \(1\) 到 \(u\) 的路径上边权最小值。

\[ f_u=\left\{\begin{matrix} Min_u & [u 是关键点]\\ \min(Min_u,\sum f_{to}) & [u 不是关键点] \end{matrix}\right. \]

虚树建出来就可以了。

dp 部分代码:

il void dfs(int u){ 
	dp[u]=0;  
	for(auto to:vec[u]){ 
		dfs(to); 
		dp[u]+=dp[to]; 
	} if(st[u]) dp[u]=Min[u]; 
	else dp[u]=min(dp[u],1ll*Min[u]); 
	vec[u].clear(); st[u]=false; 
} 

P4103 [HEOI2014] 大工程

先考虑最小最大值。

定义 \(Min_u\) 和 \(Max_u\) 表示 \(u\) 子树内所有关键点到 \(u\) 的最小/最大值。

答案有两种情况:

  1. \(u\) 是关键点,在儿子中找到最小/最大值。

  2. \(u\) 不是关键点,找两个儿子的值拼起来即可。

再考虑代价和,其实就是计算每一条边对答案的贡献。

定义 \(dp_u\) 表示 \(u\) 子树内所有关键点到 \(u\) 的距离和,\(g_u\) 表示 \(u\) 子树内关键点个数。

将 \(u\) 到 \(to\) 这一段路径的长度记为 \(w\),\(to\) 儿子的贡献即为 \((g_u-g_{to}) \times (dp_{to}+g_{to} \times w)\),即就是除开 \(to\) 儿子后其他关键点和 \(to\) 子树连边的次数乘上 \(to\) 子树内所有关键点到 \(u\) 的距离和。

建出虚树即可。dp 代码:

il void dfs(int u){ 
	dp[u]=g[u]=0; 
	Mindep[u]=INF,Maxdep[u]=-INF; 
	if(st[u]) g[u]=1,Mindep[u]=Maxdep[u]=0; 
	for(auto to:vec[u]){ 
		dfs(to); 
		int w=dep[to]-dep[u]; 
		Min=min(Min,Mindep[u]+Mindep[to]+w); 
		Max=max(Max,Maxdep[u]+Maxdep[to]+w); 
		Mindep[u]=min(Mindep[u],Mindep[to]+w); 
		Maxdep[u]=max(Maxdep[u],Maxdep[to]+w); 
		g[u]+=g[to],dp[u]+=dp[to]+w*g[to]; 
	} for(auto to:vec[u]){ 
		int w=dep[to]-dep[u]; 
		ans+=1ll*(g[u]-g[to])*(dp[to]+w*g[to]); 
	} st[u]=false,vec[u].clear(); 
} 

CF613D Kingdom and its Cities

先考虑无解的情况:一个点是关键点且他的父亲也是关键点。

建立出虚树后,还是分两种情况讨论:

  1. \(u\) 是关键点,则需要将它与儿子节点的路径断掉。

  2. \(u\) 不是关键点,记 \(cnt\) 为它的儿子节点中关键点的数量,若 \(cnt>1\),则将 \(u\) 占领。若 \(cnt=1\),则将 \(u\) 标记为关键点,回溯到父节点去短边。

dp 代码:

il int dfs(int u){ 
	int res=0,cnt=0; 
	for(auto to:vec[u]) res+=dfs(to),cnt+=(st[to]?1:0); 
	if(st[u]) res+=cnt; 
	else{ 
		if(cnt>1) res++; 
		else if(cnt==1) st[u]=true; 
	} return res; 
} 

咕咕咕。

标签:cnt,Min,int,笔记,学习,Maxdep,虚数,dp,关键点
From: https://www.cnblogs.com/Celestial-cyan/p/18122375

相关文章

  • 具体数学学习笔记(更新中)
    第五章5.1组合数基础P1405.24求证:\[\sum_k\binoml{m+k}\binom{s+k}n(-1)^k=(-1)^{l+m}\binom{s-m}{n-l}\]H_W_Y老师有点太强了,归纳法纯shaber,考虑直接推式子:\[LHS=\sum_{k}\binom{m+k-l-1}{m+k}\binom{n-s-k-1}{n}(-1)^{m+n}\\=(-1)^{m+n}\sum_k\binom{m-l-1+......
  • Unity类银河恶魔城学习记录12-7-2 p129 Craft UI - part 2源代码
    Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibiliUI_CraftWindow.csusingUnityEngine.UI;usingTMPro;usingUnityEngine;usingU......
  • FPGA入门笔记011_B——搭建串口收发与存取双口RAM简易应用系统
    1、实验现象​ 通过串口发送数据到FPGA中,FPGA接收到数据后将数据存储在双口ram的一段连续空间中,通过QuartusII软件提供的In-SystemMemoryContentEditor工具查看RAM中接收到的数据。当需要时,按下设计好的按键,则FPGA将RAM中存储的数据通过串口发送出去。2、......
  • 大菜菜学习RabbitMQ——第二篇
    我在上一节讲述了如何使用Rabbitmq图形化界面在我们学习这个的基础使用,然后我们现在就要做的就是用java进行rabbitmq操作首先在黑马课上有一个mq-demo文件这个资料,各位可以去微信程序里面下载对应资料包,然后会在百度网盘里链接:https://pan.baidu.com/s/1VFdBOQYZVACxUBkzBuLVHA......
  • 大菜菜学习RabbitMQ——第一篇
    现在开始呢我在学MQ,首先这篇博客,如果需要借鉴的话,前提是,你要有消息队列对应的前置知识,如果没有的话可以去B站或者去其他的博客上面学习不多逼逼,现在开始首先是localhost:15672,如果你下载好了rabbitmq,这个应该是很不陌生的,对于刚开始使用者来说就是guest,但是我们其实可以添加用户......
  • [网络安全自学篇] 一.入门笔记之看雪Web安全学习及异或解密示例
    文章目录一.工具&术语1.网安术语2.常用工具3.推荐文章二.常见攻击1.SQL注入2.XSS跨站3.越权漏洞4.CSRF跨站请求伪造5.支付漏洞三.音乐异或解密示例四.总结一.工具&术语1.网安术语常见安全网站及论坛:看雪(https://bbs.pediy.com/)安全客(https://www.anquanke.com)fre......
  • JavaScript学习 BOM操作
    BrowserObjectModel(BOM) 是一套专为与浏览器交互而设计的API,它允许JavaScript访问和操纵浏览器窗口以及浏览器本身的相关特性。以下是对BOM主要对象及其操作的详细讲解:1.Window对象Window对象 是BOM的核心,它代表浏览器窗口,并且是JavaScript全局对象。这意味着所有全局......
  • 【笔记】栈(Stack)
    一、什么是栈栈:一种特殊的线性表,其只允许在固定的一端(也就是在表尾)进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。不含任何数据元素的栈称为空栈 。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的原则。注意:1、栈是一个线性表,那......
  • Vue3 · 小白学习全局 API:常规
    全局API:常规本次笔记versionnextTick()defineComponent()defineAsyncComponent()defineCustomElement()1.version暴露当前所使用的Vue版本。类型string示例import{version}from'vue'console.log(version)2.nextTick()等待下一次DOM更新刷新的工具......
  • 重链剖分学习笔记
    Part.1引入重链剖分是一种用于解决树上的路径查询和修改问题的算法,他能将\(O(n)\)级别的操作转换为\(O(\logn)\)的级别,可以说十分常用。本文将带你深入解析这个算法。Part.2概念和思路在讲解本算法之前,我们先引入一些概念:轻重儿子:对于一个树上的节点\(u\),其儿子中子......