CF1381D The Majestic Brown Tree Snake/SS251114C. 历遍的树(inverse)

news/2025/11/14 22:08:47/文章来源:https://www.cnblogs.com/wingheart/p/19223514

CF1381D The Majestic Brown Tree Snake/SS251114C. 历遍的树(inverse)

题意

给你一棵 \(n\) 个点的树。一条蛇在路径 \((h,t)\) 上。

蛇像火车一样移动。问蛇能否走到路径 \((t,h)\),即反转。

\(h \neq t\)。要线性或者接近线性做法。

思路

蛇会怎么走?

大概是这样的:有一个以 \(u\) 为枢纽的三叉路,整个蛇在其中一条岔路的链上。面向 \(u\) 的为蛇头。

然后蛇正向整个开进另一条岔路,然后再倒着整个开进第三条岔路,最后正向开回去。


我们把合法的枢纽叫做关键点。当存在三条长度大于等于蛇长的岔路时,这个枢纽是合法的。

蛇想要开到这样的三叉路里,发现它很容易走到树的直径。


结论 1:若直径上不存在关键点,则整个树不存在关键点。否则直径上一定存在关键点。

结论 2:若蛇可以到达一个关键点,则蛇可以到达任意关键点。

结论 2-2:若存在答案,蛇一定可以到达直径上的关键点。


证明 1。

img

证毕。


证明 2。

直接借用上图。\((s,t)\) 是直径。

假设 \(u\) 是一个关键点。蛇可以到达 \(u\)。那么蛇直接开进岔路 \(a\),然后开到 \(t\) 那里去即可。

所以一定可以从直径外一个关键点走到直径上的关键点。逆操作显然也成立。

显然也可以从直径上一个关键点走到直径上另一个关键点。


所以先求出树的直径。

找到直径上任意一个关键点 \(u\)

如果蛇可以有一端在 \(u\) 上,则有解。

\(u\) 为根。若 \(h,t\) 是祖孙关系,蛇就可以开到根。

否则求出 \(h,t\) 的 LCA。

在它们变成祖孙关系之前,LCA 不变。

蛇会来回来回地走,每次正着/倒着走到最远的叶子。

如果蛇走到同一个位置,则返回无解。

因为蛇不会走到同一个位置,所以直接模拟即可。

总时间复杂度线性。

code

#include<bits/stdc++.h>
#define sf scanf 
#define pf printf 
#define rep(x,y,z) for(int x=y;x<=z;x++) 
#define per(x,y,z) for(int x=y;x>=z;x--) 
using namespace std;
typedef long long ll;
namespace wing_heart {constexpr int N=1e5+7;int T,n;int h,t,len;int lca;vector<int> to[N];int dep[N],mxdep[N],fa[N],gson[N];int rt;int dfs0(int u,int f) {fa[u]=f;dep[u]=dep[f]+1;int x = u;for(int v : to[u]) if(v^f) {int p = dfs0(v,u);if(dep[p]>dep[x]) x=p;}return x;}void getlen() {len=1;int u=h,v=t;if(dep[u]<dep[v]) swap(u,v);while(dep[u]>dep[v]) ++len, u=fa[u];while(u!=v) len+=2, u=fa[u], v=fa[v];}void findrt(int u,int fa) {dep[u]=dep[fa]+1;mxdep[u]=dep[u];int cnt=0;for(int v : to[u]) if(v^fa) {findrt(v,u);mxdep[u]=max(mxdep[u],mxdep[v]);if(mxdep[v]-dep[u]+1>=len) ++cnt;}if(dep[u]>=len && cnt>=2) rt=u;}void init(int u,int f) {fa[u]=f;dep[u]=dep[f]+1;mxdep[u]=dep[u];gson[u]=0;for(int v : to[u]) if(v^f) {init(v,u);mxdep[u]=max(mxdep[u],mxdep[v]);if(mxdep[v] > mxdep[gson[u]]) gson[u]=v;}}void getlca() {int u=h,v=t;if(dep[u]<dep[v]) swap(u,v);while(dep[u]>dep[v]) u=fa[u];while(u!=v) u=fa[u],v=fa[v];lca=u;}void main() {sf("%d",&T);while(T--) {sf("%d%d%d",&n,&h,&t);rep(i,1,n) to[i].clear();rep(i,1,n-1) {int u,v;sf("%d%d",&u,&v);to[u].push_back(v), to[v].push_back(u);}int u = dfs0(1,0); // 找到直径的一端getlen(); // 求出蛇长rt=0;findrt(u,0); // 找到关键点if(!rt) {puts("NO");continue;}init(rt,0);getlca();int deph=dep[h],dept=dep[t];while(lca!=h && lca!=t) {int cdeph=mxdep[h];if(cdeph-dep[lca]+1>=len) {t=lca;break;}while(gson[h]) h=gson[h], t=fa[t];int cdept=mxdep[t];if(cdept-dep[lca]+1>=len) {h=lca;break;}while(gson[t]) t=gson[t], h=fa[h];if(cdeph==deph && cdept==dept) {puts("NO");break;}deph=cdeph, dept=cdept;}if(lca==h || lca==t) puts("YES");}}
}
int main() {wing_heart :: main();
}

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

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

相关文章

2025年11月宁夏数字人服务商/供应商最新专业推荐:AI驱动下的企业数字化转型新引擎

随着人工智能技术的飞速发展,数字人作为AI技术的重要应用成果,正逐渐成为企业数字化转型的核心力量。在宁夏地区,多家科技企业纷纷布局数字人领域,为不同行业提供多样化的数字人解决方案。本榜单基于技术实力、产品…

[KaibaMath]1020 与海明码有关的最小值问题

海明码的核心原理是通过插入校验位建立数据位与校验位的对应关系,实现单比特错误纠正和多比特错误检测。本文给出已知m个数据位,求校验位n的最小值的求解公式。

FreeSWITCH使用RNNoise进行实时通话降噪

FreeSWITCH使用RNNoise进行实时通话降噪操作系统:Debian 12.5_x64 FreeSWITCH版本: 1.10.11 rnnoise版本:0.2从事FreeSWITCH相关工作,大概率会遇到静音检测和降噪的事情,之前整理过vad相关的内容: https://mp.we…

不是 DE_aemmprty 的草稿纸

关于难度\(\textbf{Easy}\):我是 zak,我一眼秒了,我觉得这题没啥技巧啊! \(\textbf{Medium}\):完全自己想出,但想了较长时间。 \(\textbf{Hard}\):不完全是自己想出。\([0, 1]\) 表示在同档题中的难度。 qoj122…

2025年宁夏数字人服务商专业评测:AI驱动下的企业数字化转型新引擎

随着人工智能技术的飞速发展,数字人作为AI技术的重要应用成果,正逐渐成为企业数字化转型的核心力量。在宁夏地区,多家科技企业纷纷布局数字人领域,为不同行业提供多样化的数字人解决方案。本榜单基于技术实力、产品…

SqlServer资料

SqlServer资料SQLServer2014性能提升 SQLServer文件与文件组总结 SQL Server表分区详细版 SqlServer内存资源释放 SqlServer内存会话连接 SqlServer连接池 SQLServer触发器 SqlServer并行基础用…

如何将 Android 联系人备份到 Mac 的 4 种容易

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

收藏项目系列---【大屏模板合集】

收藏项目系列---【大屏模板合集】Gitee链接: https://gitee.com/iGaoWei/big-data-view GitHub链接: https://github.com/iGaoWei/BigDataView愿你走出半生,归来仍是少年!

Spring AI Alibaba 项目源码学习(六)-Agent Framework 工作原理与使用

Agent Framework 工作原理与使用 请关注微信公众号:阿呆-bot 概述 Spring AI Alibaba Agent Framework 是一个基于 ReAct(Reasoning + Acting)模式的智能 Agent 开发框架,为 Java 开发者提供了快速构建、编排和部署…

分布式之RabbitMQ的使用(3)QueueBuilder - 详解

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

2025年市面上口碑好的出国留学中介机构哪家强,全球联申/名校录取/留学就业一体化/背景提升/语言培训中介哪家好

2025年市面上口碑好的出国留学中介机构哪家强,全球联申/名校录取/留学就业一体化/背景提升/语言培训中介哪家好行业权威榜单发布,优质机构综合测评 随着全球化教育理念的深入普及和留学需求的持续攀升,出国留学中介…

网络犯罪新手段:黑客如何利用IT技术实施货物盗窃

本文详细揭露了网络犯罪分子如何通过网络钓鱼、远程监控工具和身份盗窃等手段入侵货运公司IT系统,窃取高价值货物。文章分析了攻击手法、行业漏洞及防护措施,涉及RMM工具、运输管理系统安全等关键技术内容。网络犯罪…

采用 OpenCASCADE 提取布尔运算后平面图形的外轮廓

采用 OpenCASCADE 提取布尔运算后平面图形的外轮廓pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

很多争论不是认知问题,而是数学问题

🧠 很多争论不是认知问题,而是数学问题一、我们日常遇到的大部分争论,其实都是“数学逻辑问题” 很多人以为自己在讨论观点,其实他们在无意识地做数学,只是形式极其粗糙:没定义:集合不明确 没量化:变量无值 没…

11/14

今天没课,真爽

25.11.14

P13046 求出每个位置后面第一个变成 \(d\) 倍数的位置就能线性 dp 了,又是树上结构的样子,略去不叙。 前面这块有个很抽象的基环树做法,我们不要学习这个。 考虑为啥不能直接哈希,因为可能没有逆元,那么发现其实是…

题解:AtCoder ARC209D A_A_i

闲话帅炸了。 这是主播被 \(n=1\) 的 case 卡爆了,望周知。 题意 给定长度为 \(n\) 的序列 \(a\),值域为 \([1,n]\),有一些位置未确定。你需要给这些未确定的位置的确定取值,使得序列 \(b_i=a_{a_i}\) 的字典序最小…

代码制作数学动画 python manim jjmpeg - 何苦

代码制作数学动画 python manim jjmpeg安装 manimpip install manim安装ffmpeg 下载未完待续。。。

重组融合蛋白技术概述

重组融合蛋白的基本概念 重组融合蛋白是通过基因工程技术将两个或多个不同基因的编码序列连接,在宿主细胞中表达产生的单一多肽链。这种技术使得研究人员能够将不同蛋白质的功能域进行组合,创造出具有新特性的蛋白质…

OpenEuler安装宝塔

准备环境 sudo dnf update -y sudo dnf install -y wget curl vim #确认系统架构和版本,宝塔官方支持的系统主要是 CentOS/RHEL 7/8、Ubuntu 16-22,openEuler属于RHEL兼容系统,所以通常可以用CentOS安装脚本 uname -…