[2020-2021 集训队作业] Tom & Jerry
题目背景
自选题 by ix35
题目描述
给定一张包含 \(n\) 个顶点和 \(m\) 条边的 无向连通图,Tom 和 Jerry 在图上进行了 \(q\) 次追逐游戏。
在第 \(i\) 次游戏中,Tom 一开始位于顶点 \(a_i\),而 Jerry 一开始位于顶点 \(b_i\)(双方任何时候都知道自己和对方的位置),追逐规则如下:
Jerry 和 Tom 交替行动,Jerry 先行动。
Jerry 每次行动可以通过无向图中的 任意多条边(可以选择不移动),但是在移动过程中不能经过 Tom 当前所在的结点,否则就会被抓住。
Tom 每次行动只能通过无向图中的 至多一条边(可以选择不移动)。
如果 Tom 在一次行动后到达了 Jerry 的位置,那么 Tom 胜利。
Tom 尽量想要胜利,而 Jerry 会尽量阻止 Tom 胜利。
现在你需要对于每一局游戏,求出 Tom 是否一定能在有限次行动内获胜。
对于 \(100\%\) 的数据,\(1\leq n,m,q\leq 10^5\),\(1\leq x,y,a,b\leq n\),\(a_i\ne b_i\)。
感性一下,会发现Tom 每一步一定是走在割点上的,不然的话 Jerry 一下子就会飞走。
那么找到圆方树,那么两个点 \((x,y)\) 称为好的,当且仅当在圆方树上他们的路径中任意两点是在原图相邻的。
而 Tom 在 \(x\),Jerry 在 \(y\) 点时,如果 \(x\) 考 \(y\) 的那个连通块满足任意一个点 \(u\),\((x,u)\) 是好的,Tom 就可以抓住 Jerry.
然后可以树形 dp 求出来某一棵子树是否满足根节点到自述中其他所有节点都是好的,换根 dp 求出来是否到子树外任意一点是好的。
如果有一个点满足到另外任意一个点都是好的,那么 Tom 可以先到这个店,所有询问都是 Yes.
否则就倍增出来看 Tom 在那棵子树,然后回答答案。
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,m,f[N],p[N],c,fa[N][20],dfn[N],low[N],idx,st[N],tp,dep[N],in[N],q,x,y;
vector<int>g[N],h[N];
map<int,int>mp[N];
void tarjan(int x)
{
dfn[x]=low[x]=++idx;
st[++tp]=x;
for(int v:g[x])
{
if(!dfn[v])
{
tarjan(v);
low[x]=min(low[x],low[v]) ;
if(low[v]==dfn[x])
{
++c;
while(st[tp+1]^v)
{
h[c].push_back(st[tp]),h[st[tp]].push_back(c);
--tp;
}
h[c].push_back(x),h[x].push_back(c);
}
}
else
low[x]=min(low[x],dfn[v]);
}
}
void sou(int x,int y)
{
dep[x]=dep[y]+1;
fa[x][0]=y;
for(int i=1;i<=19;i++)
fa[x][i]=fa[fa[x][i-1]][i-1];
f[x]=1;
for(int v:h[x])
{
if(v==y)
continue;
sou(v,x);
if(x<=n)
f[x]&=f[v];
else
f[x]&=mp[y][v]&f[v];
}
}
int ask(int x,int k)
{
for(int i=0;i<20;i++)
if(k>>i&1)
x=fa[x][i];
return x;
}
void dfs(int x,int y)
{
int cnt=0;
p[x]=1;
for(int v:h[x])
if(v^y)
cnt+=f[v];
for(auto v:h[x])
if(v^y&&(x<=n||in[v]==h[x].size()-1)&&cnt-f[v]==h[x].size()-1-(bool)y)
dfs(v,x);
}
int main()
{
scanf("%d%d%d",&n,&m,&q),c=n;
for(int i=1,u,v;i<=m;i++)
{
scanf("%d%d",&u,&v),mp[u][v]=mp[v][u]=1;
g[u].push_back(v),g[v].push_back(u);
}
tarjan(1);
sou(1,0);
for(int i=1;i<=n;i++)
{
for(auto v:g[i])
{
if(v>i)
continue;
if(fa[i][1]==v)
in[i]++;
else if(fa[v][1]==i)
in[v]++;
else
in[i]++,in[v]++;
}
}
dfs(1,0);
for(int i=1;i<=n;i++)
{
if(f[i]&&p[i])
{
for(int j=1;j<=q;j++)
puts("Yes");
return 0;
}
}
while(q--)
{
scanf("%d%d",&x,&y);
if(dep[y]<dep[x]||ask(y,dep[y]-dep[x])^x)
puts(p[x]? "Yes":"No");
else
puts(f[ask(y,dep[y]-dep[x]-1)]? "Yes":"No");
}
}
[2020-2021 集训队作业] Tom & Jerry的更多相关文章
- IOI 2020 国家集训队作业
\(\checkmark\) 试题一 完成情况 试题二 完成情况 试题三 完成情况 cf549E cf674G arc103_f \(\checkmark\) cf594E agc034_f agc0 ...
- 「2020-2021 集训队作业」Yet Another Linear Algebra Problem(行列式,Binet-Cauchy 公式)
题面 出题人:T L Y \tt TLY TLY 太阳神:Tiw_Air_OAO 「 2020 - 2021 集 训 队 作 业 」 Y e t A n o t h e r L i n e a r A ...
- UOJ #449. 【集训队作业2018】喂鸽子
UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...
- [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥
题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...
- 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)
[UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...
- 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)
[UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...
- UOJ#418. 【集训队作业2018】三角形
#418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...
- 2019.2.25 模拟赛T1【集训队作业2018】小Z的礼物
T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...
- 2017国家集训队作业Atcoder题目试做
2017国家集训队作业Atcoder题目试做 虽然远没有达到这个水平,但是据说Atcoder思维难度大,代码难度小,适合我这种不会打字的选手,所以试着做一做 不知道能做几题啊 在完全自己做出来的题前面 ...
- 2017国家集训队作业[agc016b]Color Hats
2017国家集训队作业[agc016b]Color Hats 题意: 有\(N\)个人,每个人有一顶帽子.帽子有不同的颜色.现在,每个人都告诉你,他看到的所有其它人的帽子共有多少种颜色,问有没有符合所 ...
随机推荐
- c# 如何将程序加密隐藏?
下面将介绍如何通过LiteDB将自己的程序进行加密,首先介绍一下LiteDB. LiteDB LiteDB是一个轻量级的嵌入式数据库,它是用C#编写的,适用于.NET平台.它的设计目标是提供一个简单易 ...
- 表格JS实现在线Excel的附件上传与下载
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在本地使用Excel时,经常会有需要在Excel中添加一 ...
- 蚂蚁集团混沌工程 ChaosMeta V0.5 版本发布
混沌工程 ChaosMeta 的全新版本 V0.5 现已正式发布!该版本包含了许多新特性和增强功能,为用户提供了支撑混沌工程各个阶段的平台能力,以及降低使用门槛的用户界面. ChaosMeta V0. ...
- 使用 OpenTelemetry 构建 .NET 应用可观测性(2):OpenTelemetry 项目简介
前世今生 OpenTracing OpenTracing 项目启动于 2016 年,旨在提供一套分布式追踪标准,以便开发人员可以更轻松地实现分布式追踪. OpenTracing 定义了一套 Traci ...
- TIKZ全局样式设置
tikz绘图引擎 TIKZ绘图引擎是基于tex实现,代码极其复杂,每次编写都要单独设置样式,甚是繁琐,如何能够全局设置呢? \begin{tikzpicture}[ auto, % 决策结点 deci ...
- springboot3框架搭建
Spring Boot 3.0.0已经发布一段时间了,越来越多的公司考虑将技术框架升级到最新版本,JDK也相应要求JDK17以上.对应Spring Boot 2.x的版本,建议先升级到Spring B ...
- 面霸的自我修养:ThreadLocal专题
王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 今天是<面霸的自我修养>第5篇文章,我们一起来看看面试中会问到哪些关于ThreadLocal ...
- 基于AvaSpe 2048测定物体的光谱曲线
本文介绍基于AvaSpec-ULS2048x64光纤光谱仪测定植被.土壤等地物高光谱曲线的方法. AvaSpec是由荷兰著名的光纤光谱仪器与系统开发公司Avantes制造的系列高性能光谱仪,广 ...
- Vue-进阶:路由及elementUI组合开发
Vue-router路由 什么是vue-router? 服务端路由指的是服务器根据用户访问的 URL 路径返回不同的响应结果.当我们在一个传统的服务端渲染的 web 应用中点击一个链接时,浏览器会从服 ...
- 【matplotlib 实战】--面积图
面积图,或称区域图,是一种随有序变量的变化,反映数值变化的统计图表. 面积图也可用于多个系列数据的比较.这时,面积图的外观看上去类似层叠的山脉,在错落有致的外形下表达数据的总量和趋势.面积图不仅可以清 ...