P10674 [MX-S1-T3] 电动力学 题解

news/2025/10/31 20:24:34/文章来源:https://www.cnblogs.com/haozexu/p/19181201

P10674 [MX-S1-T3] 电动力学 题解

提供一种比现有题解简单的 DP 方式和用到结论的证明。


首先,建立原图的圆方树,注意到如果两个圆点 \(x,y\in T\),那么在圆方树上 \(x\to y\) 路径上的所有方点对应的点双连通分量中的点都能加入 \(S\),为了证明这一点,我们需要一个观察。

观察 在一个点双连通图中,如果存在三个互异的点 \(x,y,s\),则必然存在一条从 \(x\)\(y\) 的简单路径且该路径经过 \(s\)

由点双连通图的性质,我们知道 \(x\to s\)\(s\to y\) 分别存在两条不交的简单路径,我们令 \(x\to s\) 的分别为 \(U_1,U_2\)\(s\to y\) 的分别为 \(V_1,V_2\),现在我们说明,使用这些路径能构造出我们想要的路径。

假设存在一对 \(U_i,V_j\) 满足他们不交,那么选择这两条路径即可。假设这种路径对不存在,我们考虑取 \(U_2\),若将其上的点按从 \(x\)\(s\) 的顺序排列,记作 \(a_1=x,a_2,a_3,\dots,a_k=s\),找到最小的 \(i\),使得 \(a_i\) 也存在于 \(V_1\)\(V_2\) 上。不妨设该 \(a_i\) 存在于 \(V_1\) 上,那么我们可以知道首先 \(a_i\) 不可能存在于 \(V_2\) 上(否则 \(V_1,V_2\) 就有交点了),其次我们可以知道对于所有 \(j<i\)\(a_j\) 也不存在于 \(V_2\) 上,那么我们此时可以找到简单路径 \(x\stackrel{U_2}{\longrightarrow} a_i\stackrel{V_1}{\longrightarrow} s\stackrel{V_2}{\longrightarrow}y\),构造完成。命题得证。


有了这一观察,我们就很容易证明上述结论,对路径上进入点双和离开点双的点应用上述观察即可。

我们设圆方树上圆点 \(x\) 点权 \(v_x\)\(1\),方点 \(x\) 点权 \(v_x\)\(2^{s_x-1}\),其中 \(s_x\) 表示 \(x\) 这个方点所对应的点双的大小,结合上述结论容易说明集合 \(T\) 对答案的贡献就是 \(\prod_{x}v_x,\text{where }\exists a,b\in T,x\in\operatorname{path}(a,b)\),其中 \(\operatorname{path}(a,b)\) 表示树上 \(a\)\(b\) 的简单路径。

接下来,我们考虑设 \(f_i\) 表示圆方树上以第 \(i\) 个点为根的子树中,所有非空集合 \(T\cup\{i\}\) 当前对答案的贡献之和。

也就是提前将选 \(i\) 的权值记上了,转移分情况讨论,以下记 \(v\)\(x\) 的直接儿子:

  • 对于方点 \(x\)\(f_x=\left(\prod_v \left(f_v+1\right)-1\right)\times2^{s_x-1}\)

  • 对于圆点 \(x\)\(f_x=2\left(\prod_v \left(f_v+1\right)-1\right)-1\)

意义非常明确,应当无需赘述。对于每个集合 \(T\),我们在其所有点的 LCA 处统计它的贡献。以下记 \(x\) 的儿子集合 \(v\in S\)

  • 对于方点 \(x\)\(ans\gets ans+\left(\sum_{P\subseteq S,|P|\ge 2}\prod_{v\in P}f_v\right)\times 2^{s_x-1}\)

    说人话就是,至少选择两个子树的集合合并,保证 LCA 是 \(x\)

  • 对于圆点 \(x\)\(ans\gets ans+\prod_v \left(f_v+1\right)+\sum_{P\subseteq S,|P|\ge 2}\prod_{v\in P}f_v\)

    说人话就是,如果选择这个点,那么子树随便怎么都行,如果不选 \(x\) 这个点,那么至少选择两个子树的集合来合并。

这些转移非常容易维护。最后,注意到我们给权值定义为 \(2^{s_x-1}\) 的原因是要排除相邻方点之间的割点,但是现在多排除了一个点,最后需要乘以 \(2\)。另外,\(S=T=\emptyset\) 是一种合法方案,给答案加 \(1\)

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
typedef long long ll;
const ll P=998244353;
ll n,m,f[N];
vector<int> e[N],rst[N];
void add(vector<int> e[N],int x,int y){e[x].push_back(y),e[y].push_back(x);
}
int tim,dfn[N],low[N],nC,siz[N];stack<int> stk;
void Tarjan(int x){low[x]=dfn[x]=++tim,stk.push(x);for(int v:e[x]){if(!dfn[v]){Tarjan(v);low[x]=min(low[x],low[v]);if(low[v]>=dfn[x]){++nC;int cur;add(rst,nC,x),siz[nC]++;do{cur=stk.top(),stk.pop();add(rst,cur,nC),siz[nC]++;}while(cur!=v);}}else low[x]=min(low[x],dfn[v]);}
}
ll pw2[N],ans;
void DP(int x,int fa){ll prod=1,sum=0;for(int v:rst[x]){if(v==fa) continue;DP(v,x),prod=prod*(f[v]+1)%P,sum=(sum+f[v])%P;}if(x>n){f[x]=(prod-1)*pw2[siz[x]-1]%P;prod=(prod-1-sum)%P;ans=(ans+prod*pw2[siz[x]-1]%P)%P;}else{ans=(ans+prod)%P,f[x]=prod*2ll%P-1;prod=(prod-1-sum)%P,ans=(ans+prod)%P;}
}
int main(){ios::sync_with_stdio(false),cin.tie(nullptr);cin>>n>>m;pw2[0]=1;for(int i=1,u,v;i<=m;i++) cin>>u>>v,add(e,u,v);for(int i=1;i<=n;i++) pw2[i]=pw2[i-1]*2ll%P;nC=n,Tarjan(1),DP(1,0);cout<<((2ll*ans%P+1)%P+P)%P;
}

做完了喵!

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

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

相关文章

【UE引擎解构】- GamePlay篇 : 移动

基本组件(继承链): UActorCompoent - 负责组件的生命周期管理、激活/停用、与Actor的绑定等USceneCompoent - 具有变换并支持附件(组件依附),但没有渲染或碰撞功能。UPrimitiveCompoent - 具有渲染和物理信息,可以实…

读后感一:《代码大全 2》—— 从 “写代码” 到 “做工程” 的思维跃迁 - A

初读《代码大全 2》时,我正陷入 “代码能跑就行” 的认知误区 —— 总以为优化语法、缩减行数就是提升代码质量的全部,直到这本书用近千页的内容,彻底颠覆了我对软件开发的认知。它没有停留在 “if-else 怎么用”“…

Ai元人文:对“局限性”的反驳

Ai元人文:对“局限性”的反驳 有些人指出,有关Ai元人文构想的研究仍存在一定的局限性。首先,由于AI元人文理论仍在发展完善中,一些核心概念和机制还需要进一步的理论论证和实证检验。其次,该理论在跨文化应用方面…

读后感二:《代码大全 2》—— 穿越技术迭代的 “软件开发说明书” - A

在这个框架迭代比季节更替还快的时代,拿起《代码大全 2》这样一本初版于 2004 年的书,我起初带着 “会不会过时” 的疑虑。但读完才发现,这本书就像软件开发领域的 “经典物理学”—— 它不依赖特定语言或框架,而是…

JDBC练习

环境准备:数据库表 tb_brand 实体类 Brand 测试用例查询所有数据 package com.itheima.example;import com.itheima.pojo.Brand; import org.junit.Test;import java.sql.*; import java.util.ArrayList;/*** 品牌数据…

2-SAT学习笔记

问题 给出一些\(0/1\)选择和一些约束条件,求出一组满足所有条件的解为方便叙述,我们把第 \(i\) 个 \(0/1\) 选择表示为 \(ai,0\), \(ai,1\) 首先观察性质,\(ax,t,ax,t\) 冲突意味着两者只能选其一。有了这个性质,我…

打造自己的 Claude Code:LangGraph + MCP 搭建一个极简的 AI 编码助手

实践是最好的学习方式。为了深入理解 LangGraph 和模型上下文协议(MCP)服务器的生态,我们来从零开始构建一个 CLI 编码代理。我们的目标是,抛开 Claude Code 那些花里胡哨的功能,看看最基础的编码代理能做到什么程…

CSP-S 2023-2024 分析

CSP-S 2023-2024 分析前言 考前临时写的题解,希望会有帮助 2023 比赛回顾 分数是 100+50+0+0=150 比赛打的没什么问题,就是当时水平菜,写不出 DP 和大模拟。 密码锁 枚举每一个密码是否可能。 消消乐 记 \(f_i\) 为…

Java:历久弥坚的编程基石,在变革中永葆活力

在技术浪潮日新月异的今天,编程语言的江湖风起云涌,新贵辈出,各领风骚数年。然而,有一门语言,自1995年诞生以来,便以其坚如磐石的稳定性、跨平台的包容性和蓬勃发展的生态系统,始终屹立于行业的核心地带,它就是…

revit api获取与连接器connector连接的图元

revit api获取与连接器connector连接的图元public void GetElementAtConnector(Connector connector) {MEPSystem mepSystem = connector.MEPSystem;if (null != mepSystem){string message = "Connector is owne…

Ant构建项目 - 沐春风

前言: Ant是java世界里第一个具有里程碑意义的项目构建工具。 官网地址:http://ant.apache.org/。 文档地址(Ant task):http://ant.apache.org/manual/index.html。 扩展工具地址(比如checkstyle和clover):http://…

专栏目录

欢迎投稿。方便有人喜欢在别人的反思下面乱评论。 也方便自己吸取教训。 UPD:现在不只是模拟赛反思目录了,想投稿的优秀文章都可以投稿。 UPD:搬运一下!欢迎投稿! 8.24总结之周练考炸了:KMP 写挂并且没有对拍。还…

MySQL 中常用函数使用

IF函数根据判断条件是否成立进行选择执行,成立时执行一条语句,不成立时执行另一条语句 语法结构:IF(condition, value_if_true, value_if_false)参数说明condition: 判断条件 value_if_true: 如果 condition 的结果…

详细介绍:基于stm32的物联网OneNet火灾报警系统

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

Java的实战与思想:从代码到架构的工程之美

Java最大的优势,不仅在于语言本身,更在于它形成了一整套企业级软件工程方法论。无论是传统的单体系统,还是现代的微服务与云原生架构,Java都具备系统化的开发、测试、部署与维护能力。 1. 分层架构(Layered Archi…

revit api创建风管

revit api创建风管public static Duct CreateDuct(Document doc) {ElementId systemTypeId, ductTypeId, levelId;systemTypeId = ductTypeId = levelId = ElementId.InvalidElementId;// 获取标高Idvar levelFilter =…

代码大全2 第四五章

读《代码大全 2》第四、五章,感觉像被老程序员拽着纠正自己的坏毛病,每句话都戳中日常编程的痛点。第四章讲变量命名和数据类型,以前写代码总图懒省事,变量叫个 “temp”“val” 就完事,结果过两天再看,根本记不…

mac | Windows 本地部署 Seata1.7.0,Nacos 作为配置中心、注册中心,MySQL 存储信息 - 教程

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

程序员修炼之道:从小工到专家读后感1

初闻《程序员修炼之道:从小工到专家》之名,以为是本堆砌进阶技巧的“武功秘籍”。但通读三分之一后豁然开朗,这本书更像一位历经千帆的技术前辈的箴言集,它不教具体语法,而是直指程序员成长的核心——如何建立职业…

代码大全2阅读1

初读《代码大全 2》时,我以为它只是一本罗列编码技巧的工具手册。但通读三分之一后才发现,这本书更像一位资深架构师的经验复盘,将编码从 “技术操作” 升华为 “工程思维”,彻底颠覆了我对 “写好代码” 的认知。…