首页 > 其他分享 >[CTS2022] 独立集问题

[CTS2022] 独立集问题

时间:2022-12-24 14:57:19浏览次数:45  
标签:一个点 texttt 独立 合法 问题 CTS2022 正负 多棵 节点

首先我们有一些发现,一个点在操作过一次后再操作第二次时周围一圈点都已经归零,意味着操作第二次时该点的权值会直接去反,那么这个点的正负性是可以任意变化的,这也就意味着一个点的周围假如没有其他点的存在,这个点的正负性是自由的。那么我们的最优化目标是尽量让点对最终的答案贡献的正负性与答案的正负性尽量的相同,而且最优化是否取到极值与判定一些点的正负贡献是否合法的难度实际上是等价的,这启发我们先考虑枚举 \(2^n\) 的正负状态,判定这个正负状态是否合法。

注意到一次消除实际上是将一个 \(+\) 与一圈 \(-\) 或一个 \(-\) 与一圈 \(+\),但在消除完后会产生很多的 \(0\),而这些 \(0\) 在删去后所对应的子树是几乎独立的,因为一个点的周围一圈都已归零,正负状态可以任意变化,可以将其相加。但一个问题是这样会导致分裂的子树无法确定其究竟选哪个点作为根节点,这样导致了状态数实际上很多。

对此我们尝试想象已经归零的节点为一个广义的通配符 \(?\),那么每一次消除时允许 \(?\) 自由变为 \(0\) 与 \(1\) 中的任意一个,每次将一个一个点与周围的一圈点均变 \(?\),如果全部能变成 \(?\) 则合法,至此我们得到了一个 \(O(2^n)\) 的解法。

但一个问题是这样的增广实际上是不好设计状态的,一个启发时考虑增广的过程的形态:一开始将一些点给染黑,然后每一个黑点进行 \(\texttt{bfs}\) 扩展,扩展出一颗树,每棵树上的兄弟节点正负性相同,根节点与其儿子正负性不同,实际上可以视为若干棵树的并。

一个错误的想法是用这些树将整棵树的边集给覆盖满,但这样意味着只存在一棵树,另一个错误的想法是将一些边将断开将剩下的树的答案合并,但这样所有的边断开就是一种合法方案,将它们两个在 \(\texttt{dp}\) 的过程中合并很有可能也存在一些问题。

一个发现是导致该问题的出现的实质是根节点集合的自由选择,那么我们可以考虑的是对根节点再加一点限制,通过一些找规律我们可以发现如下的限制:

令根节点集合为 \(S\) ,则 \(S\) 合法的充要条件为对于任意边 \((u,v)\),\(u,v\) 不同时属于 \(S\)。

我们考虑证明该结论,如果两个根节点相邻,那么意味着它们之间会互相的影响,导致谁都不能先操作,反之如果一个根与另一颗树的非根节点相邻,那么只要满足根在非根节点之前操作即不会出现这样的情况。注意到原图是一颗树,而这样的偏序关系是单向的,所以不会形成环,以拓扑排序的方式增广则可以得到一组合法解。

有了上述结论,我们可以考虑在 \(\texttt{dp}\) 时记录如下的状态\(:\)

\(1.\)一个点与其父亲节点之间的边不在选中的多棵树的边集中,且该节点不以根的形式出现。

\(2.\)一个点与其父亲节点之间的边不在选中的多棵树的边集中,且该节点以根的形式出现。

\(3.\)一个点与其父亲节点之间的边在多棵树的边集中形成了一条父亲向该节点的单向边。

\(4.\)一个点与其父亲节点之间的边在多棵树的边集中形成了一条该节点向父亲的单向边。

对每种状态分别 \(\texttt{dp}\) 即可做到 \(O(n)\)。

标签:一个点,texttt,独立,合法,问题,CTS2022,正负,多棵,节点
From: https://www.cnblogs.com/zhouhuanyi/p/17002860.html

相关文章

  • 关于 MySQL 嵌套子查询中,无法关联主表字段问题的折中解决方法
    今天在工作中写项目的时候,遇到了一个让我感到几乎无解的问题,在转换了思路后,想出了一个折中的解决方案,记录如下。其实,问题的场景,非常简单:就是需要查询出上图的数据,红框是......
  • WebApi跨域问题
    原来写WebApi遇到了跨域的问题我使用的解决办法是从NuGet下载Microsoft.AspNet.WebApi.Cors然后在项目的App_Start文件夹的WebApiConfig中添加//WebAPI配置和服......
  • 自动化测试神器playwright的安装及常见问题解决
    前言相信自动化测试的同学,对于另一个Python自动化测试神器selenium并不陌生,在playwright出现之前,selenium是自动化测试最常用的Python库,他支持多平台:windows、linux、MAC,且......
  • VsCode搭建C语言运行环境以及终端乱码问题解决
    在VsCode中搭建C/C++运行环境需要先安装以下插件1、安装c/c++插件2、安装coderunner插件当然也可以安装一些其他的美化插件根据个人习惯,但是以上这两个是必装的......
  • 05-独立按键
    #include"reg52.h"sbitS7=P3^0;sbitS6=P3^1;sbitS5=P3^2;sbitS4=P3^3;sbitL1=P0^0;sbitL2=P0^1;sbitL3=P0^2;sbitL4=P0^3;voidSe......
  • 2022.12.24 - vant按需引入样式不展示问题
    vue项目中引入vant组件,若发现vant组件样式失效,通常有以下几种解决方法:方法一:引入全局样式 在引入vant组件的地方或者全局引入vant组件所有的样式,引入方法为:在vue引入van......
  • 问题记录:finalshell 无法连接Ubuntu20
    参考:https://blog.csdn.net/qq_45037155/article/details/123632424#:~:text=FinallShell连接Ubuntu报错:java.net.ConnectException%3AConnectionrefused%3Aconnect无......
  • 【AGC】使用付费下载退出应用时崩溃问题
    问题背景:付费下载有两种实现方式,一种是不集成DRMServiceSDK的方式,在应用发布时勾选“付费选项”,但会容易导致该应用可以被其他用户传播、安装,获取到该应用的其他用户无需......
  • instagram注册遇到的问题,注册方法
    Instagram是一个用于分享照片和视频的社交媒体应用程序,其中包含大量的用户生成内容和公共账户。如果您想加入Instagram并开始使用该应用程序,则需要进行注册。要在Instagra......
  • 02.关于线程你必须知道的8个问题(上)
    大家好,我是王有志,欢迎来到《Java面试都问啥?》的第一篇技术文章。这个系列会从Java部分开始,接着是MySQL和Redis的内容,同时会继续更新数据结构与算法的部分,这样在第一阶段,我......