P7353 [2020-2021 集训队作业] Tom Jerry 题解

news/2025/10/29 17:15:08/文章来源:https://www.cnblogs.com/memset234/p/19174950

Sol

注意到 T 想赢必须一步一步缩小 J 的移动空间,所以 T 最优只会移动到割点来缩小 J 的移动空间最终让 J 无处可移。

所以我们考虑建出原图的圆方树。

考虑对于一组询问,把 \(a\) 提起来作为根,那么设 \(b\)\(a\) 的子节点 \(c\) 子树中的节点,那么第一步肯定移动到 \(c\) 的子树中的节点,所以我们只关心在 \(c\) 的子树中是否所有点为 J 的位置时,T 有必胜策略(即可以通过上述方法追到 J)。

你会发现这个显然是可以 dp 的,设 \(dp_{i}\) 表示 J 在以 \(a\) 为全局根,以 \(i\) 为根的子树时,T 是否可以抓到 J,答案是 \(dp_{c}\)

肯定不能每个询问都提个根跑 dp,可以用一种类似与换根的东西,由于以 \(a\) 作为根的子结点,实际上就是以 \(1\) 作为根 \(a\) 的子结点加上 \(a\) 的父亲(如果有父亲的话),所以再设 \(f_{i}\) 表示 J 在 \(i\) 的子树外的时,T 是否可以抓到 J,具体转移看代码。

这样就只用跑一遍了,时间复杂度 \(O(n \log n)\)。(此处认为 \(n,m,q\) 同阶)

Code

#include<bits/stdc++.h>
using namespace std;
#define int long longinline int read()
{int x(0);char ch(getchar());while(!isdigit(ch))ch=getchar();while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x;
}const int N=2e5+5;
int n,m,q,ext,dfn[N],low[N],bh[N],siz[N],hvy[N],zg[N],tot,cnt,fa[N],dep[N];
vector<int>nbrg[N],nbrt[N];
set<int>st[N];
bool dp1[N],dp2[N];
stack<int>stk;void Tarjan(int cur)
{dfn[cur]=low[cur]=++tot;stk.push(cur);for(int nxt:nbrg[cur]){if(dfn[nxt]==0){Tarjan(nxt);low[cur]=min(low[cur],low[nxt]);if(low[nxt]==dfn[cur]){ext++;while(stk.top()!=nxt){int x=stk.top();stk.pop();nbrt[x].push_back(ext);nbrt[ext].push_back(x);}stk.pop();nbrt[nxt].push_back(ext);nbrt[ext].push_back(nxt);nbrt[cur].push_back(ext);nbrt[ext].push_back(cur);}}elselow[cur]=min(low[cur],dfn[nxt]);}return ;
}void dfs(int cur,int fa)
{::fa[cur]=fa;dep[cur]=dep[fa]+1;siz[cur]=1;bh[cur]=++cnt;dp1[cur]=true;for(int nxt:nbrt[cur]){if(nxt==fa)continue;dfs(nxt,cur);siz[cur]+=siz[nxt];if(siz[nxt]>siz[hvy[cur]])hvy[cur]=nxt;dp1[cur]&=dp1[nxt];if(cur>n&&!st[fa].count(nxt))dp1[cur]=false;}return ;
}void second_dfs(int cur)
{if(fa[cur]==cur)zg[cur]=zg[fa[cur]];elsezg[cur]=cur;set<int>stt;stt.clear();stt.insert(fa[cur]);int num=0;for(int nxt:nbrt[cur]){if(nxt==fa[cur])continue;stt.insert(nxt);if(dp1[nxt]==false)num++;}for(int nxt:nbrt[cur]){if(nxt==fa[cur])continue;dp2[nxt]=dp2[cur]&&(num==0||(num==1&&dp1[nxt]==false));if(cur>n){int num=1;for(int u:nbrg[nxt])if(stt.count(u))num++;if(num!=(int)stt.size())dp2[nxt]=false;}}for(int nxt:nbrt[cur])if(nxt!=fa[cur])second_dfs(nxt);return ;
}inline int jump(int x,int y)
{while(dep[x]<dep[y]){y=zg[y];if(fa[y]==x)return y;y=fa[y];}return hvy[x];
}signed main()
{ext=n=read(),m=read(),q=read();for(int i=1;i<=m;i++){int x(read()),y(read());st[x].insert(y);st[y].insert(x);nbrg[x].push_back(y);nbrg[y].push_back(x);}Tarjan(1);dfs(1,0);dp2[1]=true;second_dfs(1);for(int i=1;i<=n;i++)if(dp1[i]==true&&dp2[i]==true){while(q--)cout<<"Yes\n";return 0;}while(q--){int a(read()),b(read());if(bh[a]<=bh[b]&&bh[b]<=bh[a]+siz[a]-1){if(dp1[jump(a,b)]==true)cout<<"Yes\n";elsecout<<"No\n";}else if(dp2[a]==true)cout<<"Yes\n";elsecout<<"No\n";}return 0;
}

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

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

相关文章

痞子衡嵌入式:在i.MXRTxxx下使能DMA链式传输可达到SPI从设备接收速率上限50Mbps

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT下使能DMA链式传输可达到SPI从设备接收速率上限50Mbps。最近痞子衡在帮一个 RT600 的 AR 眼镜客户优化 SPI 从设备接收数据的速率,我们知道 …

国产LTCC低通滤波器HT-LFCG-530+实测:完美替代LFCG-530+,5G/WiFi6/车规全场景

国产LTCC低通滤波器HT-LFCG-530+实测:完美替代LFCG-530+,5G/WiFi6/车规全场景封装对比 ① 尺寸:5.03.01.1 mm,与原版游标卡尺测量完全一致,焊盘0.450.65 mm,0.65 mm间距,8Pin,钢网不用改。 ② 重量:16.3 mg v…

C语言 打印菱形图案

先画图,找关系,搞明白关系就会做题了//数量关系 // 3.空数 4.星数 1.val:辅助值 2.层数// * 3=4-1 1 4=mid 1// *** 2=5-3 3 5=mid+1 …

Java并发编程利器:从ConcurrentHashMap到Fork/Join的奇幻之旅

上篇讲了Lock锁、AQS相关的内容,本篇讲一下线程安全的类,拿来即用无需其他操作就能达到线程安全的效果,省力又省心 ~ ~你是否曾为多线程编程中的各种坑而头疼?本文将用生动比喻和实用代码,带你轻松掌握Java并发容…

mysql报错many connections errors

mysql报错many connections errors如上图所示 首先使用可以访问数据库的主机进入数据库,我的mysql在linux系统中直接从Linux系统进入然后重新使用可视化工具进行连接即可!

2025薪酬管理系统推荐:6大主流系统全面对比与选型指南

引言:复杂多变的薪酬挑战与数字化破局之道 在 “降本增效”成为主旋律的2025年,中国企业面临的薪酬管理挑战愈发复杂和严峻。薪酬,作为企业人力资源管理的核心环节,不仅关乎员工的切身利益和组织士气,更是企业合规…

Solon (可替换 SpringBoot)集成 Docker 实战:30分钟搞定轻量级应用容器化部署

本文介绍了如何将Solon框架与Docker快速集成,突出了Solon在启动速度、内存占用和容器化方面的优势。文章从环境准备入手,详细说明了两种Docker打包方式(Maven插件和Dockerfile),提供了完整的配置示例和操作命令,…

vue2 组件封装 el-date-picker 日期

vue2 组件封装 el-date-picker 日期 基本使用都满足包括常用的:时间格式 :type [date,datetime,daterange ....]快捷方式 :日期左侧:如 今天,昨天,一个月前日期日期禁用:禁用日期段其它相关属性custom-date-pi…

我使用FHQ写了线段树2

虽然并没有任何的意义,但是我觉得很有意思,所以记录一下: #include <bits/stdc++.h> #define int long long using namespace std; const int MN=1e6+116; struct Node{int lc, rc, siz, rnd;int val, sum, a…

092_尚硅谷_for循环注意事项和细节(1)

092_尚硅谷_for循环注意事项和细节(1)1.for循环的第二种写法2.for循环的第三种写法_死循环3.for循环的第三种写法_死循环使用break终止循环

详细介绍:【网络通讯安全认证的理解:从密钥签名、数字证书到 HTTPS/TLS 流程】

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

VK36N5D 工作电压 2.2-5.5V 触摸芯片抗干扰5键触摸触控 5路触摸检测IC

VK36N5D具有5个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较 高的集成度,仅需极少的外部组件便可实现触摸按键的检测。 提供了5个1对1输出脚,1个触摸状态输出脚,可通过IO脚选择上电输出电平和输…

魔兽争霸3冰封王座修改器 下载安装教程(图文步骤 + 功能详解)

魔兽争霸3冰封王座修改器下载与安装教程(适配1.24e~1.26版本),完整讲解安装方法、功能用法、快捷键操作、兼容性优化与常见问题解决方案。支持Windows 10 / 11系统,安全稳定。魔兽争霸3冰封王座修改器 下载安装教程…

Softmax回归模型

这段代码是一个完整的 Softmax回归模型 实现,用于解决 Fashion-MNIST数据集的图像分类问题。简单来说,它的作用是:让计算机通过学习大量衣服、鞋子等服饰图片,学会识别新的服饰图片属于哪一类(比如T恤、裤子、运动…

Oracle的connect by level在MySQL中的华丽变身 - 详解

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

handsontable实现新增删除行(双行)

handsontable实现新增删除行(双行)// 配置方法const tableSettings = computed(() => {return {...hotTableParams,nestedHeaders: false,filters: false,columnSorting: false,height: 358,rowHeaders: false,co…

2025年国产角接触球轴承厂家推荐 一文了解轴承厂家选择标准

角接触球轴承在机械设备中的应用广泛,特别是精密机床、高速电机、电主轴等运行要求高的场合,更需要质量品质好一点的角接触轴承。想要轴承用的好,就得找到合适的生产厂家,下面就来推荐下2025年值得信任的国产角接触…

vxe-table 树形表格显示连接线的方式

vxe-table 树形表格显示连接线的方式 完整连接线 通过 tree-config.showLine 来启用是否显示连接线<template><div><vxe-grid v-bind="gridOptions"></vxe-grid></div> </…

2025年上海衣帽间定制机构权威推荐榜单:衣帽间设计/衣帽间十大品牌/衣帽间装修源头公司精选

在上海,一个规划合理的衣帽间正成为新兴住宅的标配。数据显示,2024年中国家装行业市场规模已突破860亿元,其中定制家具份额持续增长,而衣帽间作为定制家具的重要组成部分,正受到越来越多消费者的青睐。 01 行业趋…

在Web应用开发中状态到底是什么?

在计算机科学中,“状态”(State)这个词经常出现在讨论有状态(Stateful)和无状态(Stateless)系统、服务或组件时。要理解“状态”到底是什么,我们可以从最基本的层面来解释。一、什么是“状态”? 简单来说,“…