当前位置: 首页 > news >正文

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

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.hskmm.com/?act=detail&tid=40676

相关文章:

  • 痞子衡嵌入式:在i.MXRTxxx下使能DMA链式传输可达到SPI从设备接收速率上限50Mbps
  • 2025薪酬管理系统推荐:6大主流系统全面对比与选型指南
  • Solon (可替换 SpringBoot)集成 Docker 实战:30分钟搞定轻量级应用容器化部署
  • 我使用FHQ写了线段树2
  • 2025年国产角接触球轴承厂家推荐 一文了解轴承厂家选择标准
  • VK36N5D 工作电压 2.2-5.5V 触摸芯片抗干扰5键触摸触控 5路触摸检测IC
  • 魔兽争霸3冰封王座修改器 下载安装教程(图文步骤 + 功能详解)
  • Softmax回归模型
  • 2025 年聚脲厂家最新推荐榜,技术实力与市场口碑深度解析,精选行业优质企业聚脲防腐/单组分双组分聚脲/MUL 聚脲/聚脲防水公司推荐
  • 2025 年铝卷厂家最新推荐榜,聚焦企业技术实力与市场口碑深度解析铝板铝卷/铝卷板/橘皮铝卷/压花铝卷/防锈铝卷/花纹铝卷公司推荐
  • qml与html通信
  • Cookie与缓存的区别
  • 无人机航测界的强者——Pix4Dmapper 4.5.6使用教程+图文步骤
  • 2025年10月企业网站建设开发公司排行榜:前十名精选
  • 2025年企业网站建设开发公司口碑排行榜Top 10
  • 基于四元数的航天器自适应滑模控制(ASMC)设计
  • 浅记线性同余方程(组)
  • Cookie登录机制
  • 2025年市场上小程序开发公司Top10权威推荐
  • USB图像采集卡:连接现实与数字世界的便捷桥梁
  • 数据结构使用技巧
  • 2025密炼机设备推荐榜:大连华韩橡塑以技术创新与全球布局引领行业发展
  • 系统异步处理机制流程总结
  • 2025年小程序商城开发公司推荐排行榜
  • 2025年pp管规格源头厂家权威推荐榜单:pp管阀件/塑料pp管/pp管连接源头厂家精选
  • 都在说国产替代Oracle,那么OCP认证还值得考吗?
  • Affinity Photo 中文版:专业摄影师与创意者的正版图像编辑利器
  • 2025年EVA再生膜厂商权威推荐榜单:EVA塑料膜/EVA超薄布/EVA再生布源头厂家精选
  • IP 欺骗攻击?
  • 快乐的CSP-S前最后一场赛拟模