当前位置: 首页 > news >正文

CCPC秦皇岛 2023 M Inverted

一.题面:

点这里

二.分析:

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.zskr.cn/news/10441.html

相关文章:

  • Hetao P10588 十载峥嵘桀骜 题解 [ 紫 ] [ 树的直径 ] [ 矩阵加速 DP ] [ 状态设计优化 ]
  • Julia 实现基于模板匹配的验证码识别方法
  • 第9节-子查询-ALL - 详解
  • 谈谈对软件工程的理解
  • [PaperReading] MemGPT: Towards LLMs as Operating Systems
  • NLP:驱动人工智能迈向 “理解” 与 “对话” 的核心引擎 - 教程
  • 实用指南:网站抓包怎么做?(网站抓包教程 HTTPS 抓包 浏览器抓包 服务器端流量分析 网站安全与调试)
  • 学习嵌入式的第三十二天——网络编程——TCP - 实践
  • HarmonyOS动态照片,简易环境助力高效开发
  • IT项目管理主要做什么?-ManageEngine卓豪
  • 9.22学习笔记
  • 实用指南:详解RabbitMQ高级特性之延迟插件的安装和使用
  • Django 视图层
  • springboot~获取原注解的方法findMergedAnnotation使用场景
  • Catalan数(卡特兰数)
  • ubuntu22.04 安装xrdp
  • CSP-J 2025 初赛试题解析(第一部分:阅读程序题(一)(16-21)) - 指南
  • 面试八股文之——JVM与并发编程/多线程 - 教程
  • 52805 JLINK 端口保护机制硬件保护具体流程分析;
  • 构建你的 MCP 能力层:.NET 9 + SK 的系统方案
  • FOC之电机模型
  • paddleOCR 图片识别
  • VS依赖项显示黄色感叹号、红色叉叉,NU1101找不到包异常情况处理方案
  • AT_arc197_e [ARC197E] Four Square Tiles
  • 不限速网盘盘点,五款免费网盘综合对比
  • Linux应用研发(君正T23):三网智能切换及配网功能
  • 学习笔记508— 威联通安装使用Zerotier One
  • Adaptix C2:跨平台渗透测试与对抗仿真框架
  • 完整教程:深度学习-神经网络(上篇)
  • WBS、甘特图、关键路径……项目计划的五大核心概念一文全懂