首页 > 其他分享 >P4426 毒瘤笔记

P4426 毒瘤笔记

时间:2024-01-31 20:55:05浏览次数:28  
标签:begin end 笔记 times 毒瘤 mathcal cases P4426 dp

前置知识点:虚树,dp。

题意

给定一个 \(n\) 个点 \(m\) 条边的无向简单联通图,满足 \(n - 1 \le m \le n + 10\)。求图的独立集个数,对 \(998244353\) 取模。

题解

首先,注意到 \(m \le n + 10\),也就是说非树边只有最多 \(11\) 条。将这些非树边连接的 \(s=22\) 个点(下面称为关键点)找出来,接着 \(2^s\) 枚举每个关键点的状态,最后对整棵树树形 dp 就可以在 \(\mathcal{O}(n2^s)\) 复杂度下解决这个问题,可以得到 70+pts 的好成绩。

于是沿着这一条思路,可以想办法优化。我们先将朴素树形 dp 给推出,设 \(f_{x, 0 / 1}\) 表示 \(x\) 为根的子树中 \(x\) 选或不选的方案数。那么有:

\[\begin{cases} f_{x, 0} = \prod\limits_{v \in x.\text{son}} (f_{v, 0} + f_{v, 1})\\ f_{x, 1} = \prod\limits_{v \in x.\text{son}} f_{v, 0} \end{cases} \]

接着我们建出关键点的虚树,对于虚树上的一条边 \((x, v)\),我们发现 \(f_{v, 0 / 1}\) 对 \(x\) 的贡献竟然可以这么表示 \(f_{x, 0 / 1} *= (k_0 \cdot f_{v, 0} + k_1 \cdot f_{v, 1})\)。并且由于在枚举关键点状态时,虚树的状态不会改变,所以 \(k_0, k_1\) 是个定值!

这样我们就可以在 \(\mathcal{O}(2^s)\) 枚举前,预处理出来系数,接着在虚树上 \(\mathcal{O}(s)\) dp 就行了。总复杂度 \(\mathcal{O}(s2^s)\)。

下面详细讲一下系数是怎么推出来的。对于虚树上的一条边 \((x, y)\),在原树上从 \(y\) 一步一步跳到 \(x\),这样复杂度显然是 \(\mathcal{O}(n)\)。记 \(p_i\) 表示 \(v\) 的 \(i\) 级祖先。\(k\) 表示系数,有:

\[\begin{cases} f_{p_i, 0} = f_{p_i, 0}' \times (k_{p_i, 0, 0} \times f_{v, 0} + k_{p_i, 0, 1} \times f_{v, 1}) \\ f_{p_i, 1} = f_{p_i, 1}' \times (k_{p_i, 1, 0} \times f_{v, 0} + k_{p_i, 1, 1} \times f_{v, 1}) \end{cases} \]

所以 \(k_{p_i, 0/1, 0/1}\) 和 \(k_{p_{i + 1}, 0/1, 0/1}\) 的关系式只需暴力展开得到:

\[\begin{cases} \begin{aligned} f_{p_{i + 1}, 0} &= f_{p_{i + 1}, 0}' \times (f_{p_i, 0} + f_{p_i, 1})\\ &=f_{p_{i + 1}, 0}' \times \left[f_{p_i, 0}' \times (k_{p_i, 0, 0} \times f_{v, 0} + k_{p_i, 0, 1} \times f_{v, 1}) + f_{p_i, 1}' \times (k_{p_i, 1, 0} \times f_{v, 0} + k_{p_i, 1, 1} \times f_{v, 1})\right]\\ &=f_{p_{i + 1}, 0}'\times\left[(f_{p_i, 0}' \times k_{p_i, 0, 0} + f_{p_i, 1}' \times k_{p_i, 1, 0})\times f_{v, 0} + (f_{p_i, 0}' \times k_{p_i, 0, 1} + f_{p_i, 1}' \times k_{p_i, 1, 1}) \times f_{v, 1}\right] \\ &\Rightarrow \begin{cases} k_{p_{i + 1}, 0, 0} = f_{p_i, 0}' \times k_{p_i, 0, 0} + f_{p_i, 1}' \times k_{p_i, 1, 0} \\ k_{p_{i + 1}, 0, 1} = f_{p_i, 0}' \times k_{p_i, 0, 1} + f_{p_i, 1}' \times k_{p_i, 1, 1} \end{cases} \end{aligned} \\ \begin{aligned} f_{p_{i + 1}, 1} &= f_{p_{i + 1}, 1}' \times f_{p_i, 0} \\ &= f_{p_{i + 1}, 1}' \times \left[ f_{p_i, 0}' \times (k_{p_i, 0, 0} \times f_{v, 0} + k_{p_i, 0, 1} \times f_{v, 1}) \right] \\ &= f_{p_{i + 1}, 1}' \times \left[(f_{p_i, 0}' \times k_{p_i, 0, 0}) \times f_{v, 0} + (f_{p_i, 0}' \times k_{p_i, 0, 1}) \times f_{v, 1}\right]\\ &\Rightarrow \begin{cases} k_{p_{i + 1}, 1, 0} = f_{p_i, 0}' \times k_{p_i, 0, 0} \\ k_{p_{i + 1}, 1, 1} = f_{p_i, 0}' \times k_{p_i, 0, 1} \end{cases} \end{aligned} \end{cases} \]

整理得:

\[\begin{cases} k_{p_{i + 1}, 0, 0} = f_{p_i, 0}' \times k_{p_i, 0, 0} + f_{p_i, 1}' \times k_{p_i, 1, 0} \\ k_{p_{i + 1}, 0, 1} = f_{p_i, 0}' \times k_{p_i, 0, 1} + f_{p_i, 1}' \times k_{p_i, 1, 1} \\ k_{p_{i + 1}, 1, 0} = f_{p_i, 0}' \times k_{p_i, 0, 0} \\ k_{p_{i + 1}, 1, 1} = f_{p_i, 0}' \times k_{p_i, 0, 1} \end{cases} \]

标签:begin,end,笔记,times,毒瘤,mathcal,cases,P4426,dp
From: https://www.cnblogs.com/CTHOOH/p/17999977

相关文章

  • 化学学习笔记
    酸\(+\)金属\(\rightarrow\)盐\(+\text{H}_2\uparrow\)酸\(+\)金属氧化物\(\rightarrow\)盐\(+\)水酸\(+\)盐\(\rightarrow\)新酸\(+\)新盐碱\(+\)盐\(\rightarrow\)新碱\(+\)新盐酸\(+\)碱\(\rightarrow\)盐\(+\)水盐\(+\)盐......
  • P4565 & CF757G 笔记
    前置知识:线段树合并,可持久化线段树,边分治,可能会用到一点点虚树。P4565边分树神题啊。。。题意给定两棵边有边权的树\(T_1,T_2\),结点数都为\(n\)。设\(d_i(x)\)表示第\(i\)棵树上\(x\)的带权深度,求一组点对\((x,y)\),使得\(d_1(x)+d_1(y)-d_1(p)-d_2(p')\)......
  • 阅读笔记3
    阅读《程序员的修炼之道:从小工到专家》第八章后,我对团队沟通和协作的重要性有了更深入的理解。这一章节详细探讨了如何建立高效的团队沟通机制,以及如何提高团队协作能力,以达到更好的软件开发效果。首先,作者强调了沟通在团队中的重要性。在软件开发过程中,团队成员之间需要频繁......
  • 1/31 学习进度笔记
    今日完成了商单案例:源码:#coding:utf8frompysparkimportStorageLevelfrompyspark.sqlimportSparkSessionfrompyspark.sqlimportfunctionsasFfrompyspark.sql.typesimportStringTypeif__name__=='__main__':spark=SparkSession.builder.appName(&qu......
  • 阅读笔记
    《人月神话》是软件工程领域的一部经典之作,它以其独特的视角和深刻的洞察力,让我对软件开发有了更加全面和深入的认识。在阅读这本书的过程中,我深深地被作者对软件开发的独到见解所吸引。作者通过自己在IBM公司从事大型软件项目开发的亲身经历,向我们揭示了软件开发过程中的种种困......
  • 阅读笔记2
    阅读完《程序员的修炼之道:从小工到专家》第七章后,我对掌握编程语言的重要性有了更深入的理解。这一章节详细探讨了如何选择适合自己的编程语言,以及如何精通掌握一门或多门编程语言。首先,作者强调了编程语言在程序员职业生涯中的重要性。编程语言是程序员表达思想、解决问题的重要......
  • 性能测试学习笔记
    一、性能测试的基本操作1、概念:体现当前服务器到底能不能带动开发的软件2、服务器优化:升级配置(服务器升级内容、cpu),横向扩容(多台服务器)3、并发:  二、性能测试的调优(具体怎么调,由开发/运维去做),测试指导开发问题发生的位置 ......
  • kali学习笔记-06-Webshell文件上传漏洞使用
    kali学习笔记-06-Webshell文件上传漏洞使用KaliLinux网络安防一、使用weevely制作一句话木马脚本在KaliLinux的终端中输入命令weevely,可以从错误提示中看到基本的使用方法。二、配置OWASP靶机三、参考文献WebShell文件上传漏洞.3......
  • python网络编程笔记(一)Socket 编程入门
    一:Socket简介套接字起源于20世纪70年代加利福尼亚大学伯克利分校版本的Unix,即人们所说的BSDUnix。因此,有时人们也把套接字称为“伯克利套接字"或"BSD套接字”。一开始,套接字被设计用在同-台主机上多个应用程序之间的通讯BSDSocket接口是TCP/IP网络的API在Linux,Unix和W......
  • kali学习笔记-05-DVWA XSS跨站脚本攻击
    kali学习笔记-05-DVWA XSS跨站脚本攻击KaliLinux网络安防一、反射型XSS攻击在OWASP的DVWA上,选中XSSreflected页面,在输入框内输入张三,页面反应正常。尝试输入一句script脚本。<script>alert('xss')</script>出现了如下的系统弹框,也就意味着后端服务器没有对特殊字符做......