题目背景

自选题 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的更多相关文章

  1. IOI 2020 国家集训队作业

    \(\checkmark\) 试题一 完成情况 试题二 完成情况 试题三 完成情况 cf549E cf674G arc103_f \(\checkmark\) cf594E agc034_f agc0 ...

  2. 「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 ...

  3. UOJ #449. 【集训队作业2018】喂鸽子

    UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...

  4. [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥

    题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...

  5. 【UOJ#450】【集训队作业2018】复读机(生成函数,单位根反演)

    [UOJ#450][集训队作业2018]复读机(生成函数,单位根反演) 题面 UOJ 题解 似乎是\(\mbox{Anson}\)爷的题. \(d=1\)的时候,随便怎么都行,答案就是\(k^n\). ...

  6. 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)

    [UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...

  7. UOJ#418. 【集训队作业2018】三角形

    #418. [集训队作业2018]三角形 和三角形没有关系 只要知道儿子放置的顺序,就可以直接模拟了 记录历史最大值 用一个pair(a,b):之后加上a个,期间最大值为增加b个 合并? A1+A2= ...

  8. 2019.2.25 模拟赛T1【集训队作业2018】小Z的礼物

    T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...

  9. 2017国家集训队作业Atcoder题目试做

    2017国家集训队作业Atcoder题目试做 虽然远没有达到这个水平,但是据说Atcoder思维难度大,代码难度小,适合我这种不会打字的选手,所以试着做一做 不知道能做几题啊 在完全自己做出来的题前面 ...

  10. 2017国家集训队作业[agc016b]Color Hats

    2017国家集训队作业[agc016b]Color Hats 题意: 有\(N\)个人,每个人有一顶帽子.帽子有不同的颜色.现在,每个人都告诉你,他看到的所有其它人的帽子共有多少种颜色,问有没有符合所 ...

随机推荐

  1. 文心一言 VS 讯飞星火 VS chatgpt (80)-- 算法导论7.4 5题

    五.如果用go语言,当输入数据已经"几乎有序"时,插入排序速度很快.在实际应用中,我们可以利用这一特点来提高快速排序的速度.当对一个长度小于 k 的子数组调用快速排序时,让它不做任 ...

  2. 一个超经典 WinForm 卡死问题的最后一次反思

    一:背景 1. 讲故事 在我分析的 200+ dump 中,同样会遵循着 28原则,总有那些经典问题总是反复的出现,有很多的朋友就是看了这篇 一个超经典 WinForm 卡死问题的再反思 找到我,说 ...

  3. 三维模型OSGB格式轻量化顶点压缩主要技术方法分析

    三维模型OSGB格式轻量化顶点压缩主要技术方法分析 在三维模型应用中,轻量化处理是提高数据传输效率.减少渲染时间和优化用户体验的重要手段.而OSGB格式是一种常见的三维模型格式,在进行轻量化处理时,顶 ...

  4. DevOps |研发效能之环境、程序、配置、SQL变更管理

    本文主要是讲如何建立有效的环境.程序.配置.SQL变更和管理平台. ​几天前和一个朋友聊到环境.程序的配置变更,SQL变更和整个上线流程.之前我们在这块也做了很多,有做的好的也有做的一般的,借机都总结 ...

  5. 【译】IntelliJ IDEA 2023.2 最新变化——JetBrains IDE 中的 AI 助手

    前言 本周所有基于 IntelliJ 的 IDE 和 .NET 工具的 EAP 版本都包含一个主要新功能:AI Assistant.本博文重点介绍我们基于 IntelliJ 的 IDE,并且即将推出专 ...

  6. SpringBoot + 自定义注解,实现用户操作日志(支持SpEL表达式)

    背景 一个成熟的系统,都会针对一些关键的操作,去创建用户操作日志. 比如: XX人创建了一条订单,订单号:XXXXXXXXX 因为操作人或者订单号是动态的,所以有些开发人员,不知道获取,就将这种操作日 ...

  7. 深入理解 Socket 编程:网络通信的基石

    深入理解 Socket 编程:网络通信的基石 引言 在现代计算机网络中,网络通信是各种应用程序之间进行数据交换和信息传输的基础.Socket 编程是实现网络通信的关键组件之一,它提供了一种方便而强大的 ...

  8. Jmeter内的参数有文件时,如何传参?

    文件类型:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet 尊重原创,转载请注明出处,谢谢!!

  9. HBuilderX内置终端无法使用不能输入

    找到HBuilderX的目录打开plugins\builtincef3terminal\script找到main.js用记事本或其他什么打开他 把这部分代码替换成这个再重启hbuilderX就可以了 ...

  10. 研发日常踩坑-Mysql分页数据重复

    踩坑描述: 写分页查询接口,order by和limit混用的时候,出现了排序的混乱情况 在进行第N页查询时,出现与第一前面页码的数据一样的记录. 问题 在MySQL中分页查询,我们经常会用limit ...