题目背景

自选题 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. 将实体类对象数据存入和读取进csv文件(可追加)

    前言 最近公司一个新的项目,因为需要存储的数据很少,单独去部署一个数据库去存储该数据显然是不划算的,所以想的是通过存入csv文件中来代替存入数据库中.说干就干. 什么是csv文件 CSV代表逗号分隔值 ...

  2. OA管理系统源码

    介绍 oa管理系统,只有基本功能,可进行二次开发 软件架构 技术框架:Spring+SpringMVC+Mybatis+BootStrap 数据库:MySQL 服务器:JDK7+Tomcat7 安装教 ...

  3. 当开源项目 Issue 遇到了 DevChat

    目录 1. 概述 2. Bug 分析与复现 3. Bug 定位与修复 4. 代码测试 5. 文档更新 6. 提交 Commit 7. 总结 1. 概述 没错,又有人给 GoPool 项目提 issue ...

  4. 4.1 应用层Hook挂钩原理分析

    InlineHook 是一种计算机安全编程技术,其原理是在计算机程序执行期间进行拦截.修改.增强现有函数功能.它使用钩子函数(也可以称为回调函数)来截获程序执行的各种事件,并在事件发生前或后进行自定义 ...

  5. 「joisc 2019 - d2t2」ふたつの料理 Two Dishes

    [link.](E - ふたつの料理 (Two Dishes) (atcoder.jp) 我要放假 神仙题. 首先可以把两根轴拉成平面(which is a common trick),把决策的过程看 ...

  6. 模拟.NET应用场景,综合应用反编译、第三方库调试、拦截、一库多版本兼容方案

    免责声明 使用者本人对于传播和利用本公众号提供的信息所造成的任何直接或间接的后果和损失负全部责任.公众号及作者对于这些后果不承担任何责任.如果造成后果,请自行承担责任.谢谢! 大家好,我是沙漠尽头的狼 ...

  7. 详解RecyclerView的预布局

    概述 RecyclerView 的预布局用于 Item 动画中,也叫做预测动画.其用于当 Item 项进行变化时执行的一次布局过程(如添加或删除 Item 项),使 ItemAnimator 体验更加 ...

  8. linux的认知与基本命令

    一.linux的了解 1. 什么是Linux?       a,Linux是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布.它主要受到Mi ...

  9. Mysql数据库、表设计规范指南

    结合网上资料与项目实际情况,总结下列MYSQL数据库设计规范. 一.MYSQL数据库设计规范1.数据库命名规范采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,禁止使 ...

  10. 轻量通讯协议 --- MQTT

    介绍 一.MQTT简介 MQTT(Message Queuing Telemetry Transport) 是一种轻量级的消息传输协议,通常用于在物联网(IoT)和传感器网络中进行通信.它设计用于在低 ...