CCPC秦皇岛 2023 M Inverted

news/2025/9/23 19:12:02/文章来源:https://www.cnblogs.com/YhjOI/p/19107796

一.题面:

点这里

二.分析:

1.性质分析:

首先,对于题目中复杂的过程描述,我们应当找到生成新图的本质。

考虑对于第 \(i\) 次操作的意义,通过点 \(u\) 生成了一个全新的点 \(u'\),然后对于 \(\forall_{v\in V(u)}\) ,如果 \(v'\) 不存在,生成无向边 \((v,u')\) ,如果 \(v'\) 存在,则生成无向边 \((v',u')\)

那么基于这个描述,我们可以手动模拟此过程。


这是题目所给的样例,结合上述分析,我们断定题目描述的过程的本质是将原图部分被标记点对称到另一个 \(G\) 上,并且将 \(G\) 中的点与原图对应点的未被标记的相邻节点连接从而得到一个新图的过程。

那么我们现在应当使用一些手段分析这个图。因为这个图是部分对称,另外有一部分是关联原图与生成的图,所以考虑分类。

现在我们定义黑边指的是两个端点都已经被复制的边的数量,红边指的是端点由一个已复制点和一个未复制点所连接的边(满足题目范围的图可能很大,有些边两个端点都未被复制,由于对答案无贡献,我们不做考虑)。如下图所示:

考虑生成树的问题,本质上是一个断边后导致断环成树的问题。所以考虑如何断边。似乎题目所给的样例有些弱,我们可以再制造一些更多点的样例。

先考虑删红边的问题,我们称两个红边为一对当且仅当他们有一个公共端点且另外两个端点是复制得到的。

现在给出一个引理:

\[Limma:对于原图(或对称图)的一个联通块(一定至少包含一条红边),若最后整个图是一颗树,当且仅当这个联通块内存在一对完整的红边 \]

证明:

考虑删去若干条黑边,使得原图和对称图中存在若干个极大联通子图,那么对于这些联通子图,若不存在一对红边连接原图与对称图,那么这些极大联通子图将对于整个图被彻底独立,所以至少存在一对这样的边。另一方面,如果存在两对,那么在原图上会形成一个环。所以最多只有一对。

有了这个引理,就可以换一个角度考虑计数的过程:

步骤一:

选择一些黑边作为断边,使得原图和对称图存在分别存在若干个联通块。

步骤二:

显然我们一定要使每个联通块存在一对红边,使得联通块与其对称部分有所相连。所以我们就钦定某一对红边不断,然后剩下的每一对红边选择其中一条进行断边。

发现整个过程与断边选择密切相关且有可计数性,考虑使用动态规划解决。注意到整个图的结构类似于两颗树以某种方式产生了对称联系从而产生了环,所以尝试使用树形dp方式定义状态。

2.构建模型:

因为图具有对称性,所以原图和对称图反过来是一样的效果,这意味着从一对分叉红边向两个图进行转移得到的结果是一样的,所以对于 \(u,u'\) 我们将其代表状态 \(f\) 存储在同一个dp值中(可以预见的是,最后的转移过程中应当是存在某种翻倍操作以满足对称性)。

定义:

\[f_{u,0/1} \]

表示对于 \(u,u'\) 所在联通块是(1)否(0)存在一对红边的方案数。显然这样定义的转移是符合树上联通块dp的模型的。转移考虑采用合并子树方法。需要注意的是,对于题目中每一次更新,我们都应当维护一个新产生的联通块进行dp,同时只遍历这个联通块以及其周边节点,因为周边节点以外的节点要么未被操作,要么在之前某一时刻被dp处理过了,所以不会对当前联通块造成贡献。

对于已存在一对红边的情况。若在前面的转移中已经保留了一对红边且子节点 \(v\) 所在联通块不存在与对称图的连接,那么应当保存连接 \((u/u',v/v')\) 所以直接把 \(T(v)\) 的贡献转移给 \(u\)。同理若在前面没有保留,那么必须使得 \(v\) 所在联通块有连接且直接贡献给 \(u\)。若 \(v\) 所在联通块已有连接,且前面转移也有连接,则我们必须断开 \(u\)\(v\) 的连接,而经过上述分析我们得到无论断开黑边还是红边我们都应当将贡献翻倍,因为对于对称图和原图断边的贡献要分开算。

所以由上述分析可得:

\[f_{u,1}=f_{u,1}\times f_{v,0}+f_{u,0}\times f_{v,1} + 2\times f_{u,1}\times f_{v,1} \]

而对于不存在红边的情况,分析方法是类似的,但是结果更简单:

\[f_{u,0}=f_{u,0}\times f_{v,0} + 2\times f_{u,0}\times f_{v,1} \]

由于是合并子树,所以在递归转移时应当注意先更新 \(f_{u,1}\) 然后再更新 \(f_{u,0}\)

Code:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cstdio>
#define int long longconst int N = 5000 + 10, MOD = 998244353;
int n, f[N][2], head[N], cnt, fa[N];
bool vis[N];int find_fa(int x) {return x == fa[x] ? x : fa[x] = find_fa(fa[x]);
}
struct edge{int v, last;
}e[N << 1];void add(int u, int v) {e[++cnt].v = v;e[cnt].last = head[u];head[u] = cnt;
}void dfs(int u, int fath) {if (!vis[u]) return ;f[u][1] = 0;f[u][0] = 1;for (int i = head[u]; i; i = e[i].last) {int v = e[i].v;if (v == fath) continue;dfs(v, u);f[u][1] = (f[u][1] * f[v][0] % MOD + f[u][0] * f[v][1] % MOD + 2 * f[u][1] * f[v][1] % MOD) % MOD;f[u][0] = (f[u][0] * f[v][0] % MOD + 2 * f[u][0] * f[v][1] % MOD) % MOD;}
}signed main() {std::cin >> n;for (int i = 1; i <= n - 1; ++i) {int u, v;std::cin >> u >> v;add(u, v);add(v, u);}for (int i = 1; i <= n; ++i) {fa[i] = i;}for (int i = 1; i <= n; ++i) {f[i][0] = 0, f[i][1] = 1;}for (int i = 1; i <= n - 1; ++i) {int node;std::cin >> node;vis[node] = true;for (int i = head[node]; i; i = e[i].last) {int v = e[i].v;if (vis[v]) {fa[find_fa(v)] = node;}}dfs(node, -1);int ans = 1;for (int i = 1; i <= n; ++i) {if (fa[i] == i) ans = (ans * f[i][1]) % MOD;}std::cout << ans << '\n';}return 0;
}

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

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

相关文章

HTTPS 映射如何做?(HTTPS 映射配置、SNI 映射、TLS 终止、内网映射与 iOS 真机验证实战) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站开发保密协议书品质好货

来源&#xff1a;学术头条摘要&#xff1a;当今&#xff0c;无人驾驶技术已经成为整个汽车产业的最新发展方向。科研院校、汽车制造厂商、科技公司、无人驾驶汽车创业公司以及汽车零部件供应商在无人驾驶技术领域进行不断地探索。今天我们为大家梳理一下无人驾驶汽车的国内外发…

甘肃省建设厅注册中心网站cms程序

要配置iptables进行路由转发&#xff0c;需要执行以下步骤&#xff1a; 确保系统已经开启了IP转发功能。可以通过执行以下命令来检查&#xff1a; sysctl net.ipv4.ip_forward如果返回的值为1&#xff0c;表示已经开启了IP转发功能。如果返回的值为0&#xff0c;可以通过执行…

专用车网站建设哪家好seo是啥软件

目录 初识VueVue模板语法数据绑定el和data的两种写法事件的基本使用$emit在子组件中定义方法&#xff0c;执行父组件的方法 Vue中的事件修饰符&#xff1a;键盘事件计算属性监视属性条件渲染列表渲染表单数据收集过滤器 笔记内容来自&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨v…

百度贴吧有没有做网站的人青岛网站建设电话

要在Spring Boot中集成Redis&#xff0c;你可以使用Spring Data Redis库来简化操作。 下面是一个示例代码&#xff1a; 首先&#xff0c;在你的Spring Boot项目的pom.xml文件中添加以下依赖&#xff1a; <dependencies><!-- 其他依赖... --><dependency>&…

江门市专业做网站公司企业网站改版新闻

概述 包含External 的表叫外部表 删除外部表只删除metastore的元数据&#xff0c;不删除hdfs中的表数据 外部表 只有一个过程&#xff0c;加载数据和创建表同时完成&#xff0c;并不会移动到数据仓库目录中&#xff0c;只是与外部数据建立一个链接。当删除一个 外部表 时&…

网站建设企业网的项目描述wordpress首页标题大小

关于WKWebView高度的问题的解决 IOS端嵌入网页的方式有两种UIWebView和WKWebView。其中WKWebView的性能要高些;WKWebView的使用也相对简单 WKWebView在加载完成后&#xff0c;在相应的代理里面获取其内容高度&#xff0c;大多数网上的方法在获取高度是会出现一定的问题&#xf…

深圳网站建设制作报价超级外链工具

day14--闰年推算小程序--2.18 习题概述 题目描述 输入 x,y&#xff0c;输出 [x,y] 区间中闰年个数&#xff0c;并在下一行输出所有闰年年份数字&#xff0c;使用空格隔开。 输入格式 输入两个正整数 x,y&#xff0c;以空格隔开。 输出格式 第一行输出一个正整数&#xf…

大三上第一篇日志

今天就是了解了一下c#,学习使用了Trae,感觉ai发展的好快,用Trae,告诉它想要什么东西,用什么语言写,就能生成对应的文件,真的太厉害了

0923模拟赛总结

ad-hoc场。 T1是一个期望题目,很唐的一点是它的建模不一样导致不会做了(?,其实只要猜一下结论就过了。 T2随机化获得了全场最高分,这是好的。但是正解作为根号分治确实就没想到,只能说题练少了。 T3是子集计数题…

报名系统网站开发wordpress占用id

为什么要使用EasyExcel easyExcel是阿里巴巴下在POI的基础上二次开发的开源api&#xff0c;以使用简单、节省内存著称。 POI由于在操作excel时是先将所有数据都读入内存后&#xff0c;再写入文件&#xff0c;比较消耗内存&#xff0c;特别是大数据量时&#xff0c;容易出现OOM…

无锡企业推广网站大连网站建设个人

DOM事件的传播机制是指当一个事件在DOM树中触发时&#xff0c;它是如何在各个元素之间传播的。DOM事件传播机制分为三个阶段&#xff1a;捕获阶段、目标阶段和冒泡阶段。此外&#xff0c;还有一种常用的技术称为事件委托&#xff0c;它能够简化事件处理程序的绑定和管理。本文将…

公司做个网站多少钱动感技术网站建设

文章目录 替换所有的问号提莫攻击Z字形变换外观数列数青蛙 替换所有的问号 算法思路&#xff1a; 从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;就遍历 a ~ z 去尝试替换即可。 class Solution {public String modifyString(String s) {char[] ss s.toCharA…

东莞网站推广行者seo08金融交易网站建设

第4章 参数估计 参数估计是统计建模的关键步骤之一&#xff0c;它涉及根据样本数据推断总体参数的过程。在统计学中&#xff0c;参数通常用于描述总体的特征&#xff0c;如均值、方差等。通过参数估计&#xff0c;我们可以利用样本信息对这些未知参数进行推断&#xff0c;从而…

诚客网站建设可以访问国外网站的dns

在电商领域&#xff0c;了解店铺的详细信息对于提升顾客的信任和忠诚度至关重要。为了帮助开发者获取和管理特定店铺的信息&#xff0c;电商平台通常提供店铺详情API接口。本文将指导你如何使用这个API接口来获取店铺的名称、描述、地址、评分等详细信息&#xff0c;并将这些信…

山西大川建设有限公司网站网络营销推广有效方式

Leetcode Test 1281 整数的各位积和之差(8.9) 给你一个整数 n&#xff0c;请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 提示&#xff1a; 1 < n < 10^5 【原始代码】&#xff1a; int subtractProductAndSum(int n){//1 < n < 10^5//…

网站镜像怎么做ip查询网站备案查询

LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.文档地址: https://liningit.github.io/LnskyDB/开源地址: https://github.com/liningit/LnskyDBnuget地址: https://www.nuget.org/packages/LnskyDB…

现在流行的网站开发u钙网logo设计官网

作者 | 宋慧 出品 | CSDN云计算 头图 | 付费下载于视觉中国 作为企业IT信息化中最热的话题&#xff0c;低代码被广泛关注和讨论。国内低代码赛道的厂商众多&#xff0c;传统表格控件厂商、互联网巨头、创业公司&#xff0c;各具优势&#xff0c;在市场攻城拔寨。而国外&#x…

java面试笔试题大汇总 ~很全面收藏 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

discuz 企业网站 模板网站链接

在 Java 中&#xff0c;所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。Throwable 有两个重要的子类&#xff1a;Exception(异常)和 Error(错误)&#xff0c;二者都是 Java 异常处理的重要子类…