当前位置: 首页 > 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.gsyq.cn/news/34139.html

相关文章:

  • 国产LTCC低通滤波器HT-LFCG-530+实测:完美替代LFCG-530+,5G/WiFi6/车规全场景
  • C语言 打印菱形图案
  • mysql报错many connections errors
  • 我使用FHQ写了线段树2
  • VK36N5D 工作电压 2.2-5.5V 触摸芯片抗干扰5键触摸触控 5路触摸检测IC
  • vxe-table 树形表格显示连接线的方式
  • 2025年上海衣帽间定制机构权威推荐榜单:衣帽间设计/衣帽间十大品牌/衣帽间装修源头公司精选
  • 在Web应用开发中状态到底是什么?
  • Cookie与缓存的区别
  • 无人机航测界的强者——Pix4Dmapper 4.5.6使用教程+图文步骤
  • qml与html通信
  • 2025 年红外测温仪厂家最新推荐榜,技术实力与市场口碑深度解析比色/感应加热/高性价比/单晶炉红外测温仪公司推荐
  • 2025年10月企业网站建设开发公司排行榜:前十名精选
  • 浅记线性同余方程(组)
  • 2025年市场上小程序开发公司Top10权威推荐
  • 2025上海单位/小区/商场/办公楼/工厂/住宅/保洁公司服务推荐榜:臣峰环境以场景化定制能力引领行业新发展
  • 可传参数的3Decharts-gl省市级地图实现(点击具体的省份及可下钻到市级地图)--详细版本
  • 2025灌装/大桶/桶装/纯净/瓶装/水处理设备推荐榜:青州路得自动化以科技创新引领行业升级
  • 【模板】扩展中国剩余定理(EXCRT)
  • 小杰深度学习(five)——正则化、神经网络的过拟合解决专业的方案
  • 2025年小程序商城开发公司推荐排行榜
  • 2025 年绿色环保板材源头厂家最新推荐榜:聚焦生态与装修板材,标杆企业深度测评
  • 2025年墓碑制造商权威推荐榜单:石材墓碑/汉白玉墓碑/手工雕刻石碑源头厂家精选
  • JVM内存启动问题
  • 查找表(LUT)基础知识(2025.10.29)
  • 国标GB28181算法算力平台EasyGBS视频实时监控系统打造城市环境监控全场景解决方案
  • 频谱分析仪的应用范围与技术解析
  • 2025 年不锈钢无缝管源头厂家最新推荐榜:重质守信企业盘点,覆盖多材质多行业适配与高性价比选购参考
  • windows下安装Nginx,并配置成服务
  • 2025年国内化工设备厂家/换热器/反应釜综合实力排行榜