P9520 [JOISC2022] 监狱

news/2024/11/18 10:25:48/文章来源:https://www.cnblogs.com/DeepSeaSpray/p/18356152

P9520 [JOISC2022] 监狱

题目描述

有一棵 \(N\) 个节点的树,有 \(M\) 个囚犯,要从 \(S_i\) 走到 \(T_i\)。每一时刻可以发布一个命令让一名囚犯走到相邻的节点,要求任意时刻囚犯不能走到同一个节点上,求是否可以令每一个囚犯从 \(S_i\) 走到 \(T_i\)

做法解析

首先我们可以发现一个囚犯要么一次走完其路径,要么不走。

故我们需要确定一个走的先后顺序,这等价于对于任意两个囚犯,我们确定他们走的先后顺序。

我们考虑囚犯 \(A\)\(B\)

  • 如果,\(S_A\)\(B\) 的路径上 那么 \(A\) 要先走。
  • 如果,\(T_A\)\(B\) 的路径上 那么 \(B\) 要先走。

我们考虑先走的囚犯向后走的囚犯连一条有向边,如果是一个 DAG 那么就可以找到一种满足条件的方案,否则不行。

直接连边是 \(O(n^2)\) 的,我们考虑 树链剖分线段树优化连边

我们需要两棵线段树,一棵 S树 表示起点,一棵 T树 表示终点。

  • \(A\) 路径上的点(\(S_A\) 除外)在 S树 上的节点向 \(A\) 连边。
  • \(A\)\(A\) 路径上的点(\(T_A\) 除外)在 T树 上的节点连边。
  • \(A\)\(S_A\)S树 上的节点连边。
  • \(T_A\)T树 上的节点向 \(A\) 连边。

对于 S树 子区间向父区间连边。

对于 T树 父区间向子区间连边。

参见下图:

P9520 [JOISC2022] 监狱-1

图片只说明建图方式,其不一定符合实际数据。

时间与空间复杂度 \(O(n log^2 n)\)

注意事项

  • 线段树虽然理论上只需要用 \(2n-1\) 个节点,但是如果使用普通的建树方式,节点的编号是 \(4n\) 级别的。

代码

然而实现的并不好。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6;
const int maxm=1e7;
struct Edge{int u,v,nxt;};
int n,m;
int dg[maxn+5];
int hd[maxn+5],et;
Edge e[maxm+5];
int idt;
int de[maxn+5],sz[maxn+5],fa[maxn+5];
int sn[maxn+5],id[maxn+5],tp[maxn+5];
int S[maxn+5],st;
int stp,sts,stt,edp;
int V[maxn+5],vt;
inline void Adde(int u,int v){dg[v]++;e[et].u=u,e[et].v=v;e[et].nxt=hd[u],hd[u]=et++;
}
void Dfs1(int u){int v;sz[u]=1;for(int i=hd[u];~i;i=e[i].nxt){v=e[i].v;if(v==fa[u]) continue;fa[v]=u;de[v]=de[u]+1;Dfs1(v);sz[u]+=sz[v];if(sz[sn[u]]<sz[v]) sn[u]=v;}
}
void Dfs2(int u,int TP){int v;id[u]=++idt;tp[u]=TP;if(sn[u]) Dfs2(sn[u],TP);for(int i=hd[u];~i;i=e[i].nxt){v=e[i].v;if(v==fa[u]||v==sn[u]) continue;Dfs2(v,v);}
}
void Build(int x,int L,int R){if(L==R) return;else{int mid=(R-L)/2+L;Adde(sts+(x<<1),sts+x);Adde(sts+(x<<1|1),sts+x);Adde(stt+x,stt+(x<<1));Adde(stt+x,stt+(x<<1|1));Build(x<<1,L,mid);Build(x<<1|1,mid+1,R);}
}
void Query(int x,int L,int R,int l,int r){if(l<=L&&R<=r) V[++vt]=x;else{int mid=(R-L)/2+L;if(l<=mid) Query(x<<1,L,mid,l,r);if(mid<r) Query(x<<1|1,mid+1,R,l,r);}
}
inline void TQuery(int l,int r,int t){if(l<=t&&t<=r){if(l<t) Query(1,1,n,l,t-1);if(t<r) Query(1,1,n,t+1,r);}else Query(1,1,n,l,r);
}
void Modify(int p,int u,int v){int tu=id[u],tv=id[v];while(tp[u]!=tp[v]){if(de[tp[u]]<de[tp[v]]) swap(u,v);vt=0;TQuery(id[tp[u]],id[u],tu);for(int i=1;i<=vt;i++) Adde(sts+V[i],stp+p);vt=0;TQuery(id[tp[u]],id[u],tv);for(int i=1;i<=vt;i++) Adde(stp+p,stt+V[i]);u=fa[tp[u]];}if(de[u]<de[v]) swap(u,v);vt=0;TQuery(id[v],id[u],tu);for(int i=1;i<=vt;i++) Adde(sts+V[i],stp+p);vt=0;TQuery(id[v],id[u],tv);for(int i=1;i<=vt;i++) Adde(stp+p,stt+V[i]);
}
inline void Solve(){int u,v;scanf("%d",&n);et=idt=0;for(int i=1;i<=n;i++) hd[i]=-1,sn[i]=0;for(int i=1;i<n;i++){scanf("%d%d",&u,&v);Adde(u,v),Adde(v,u);}Dfs1(1);Dfs2(1,1);scanf("%d",&m);et=0;stp=0,sts=m,stt=m+4*n,edp=m+8*n;for(int i=1;i<=edp;i++) hd[i]=-1,dg[i]=0;Build(1,1,n);for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);Modify(i,u,v);vt=0;Query(1,1,n,id[u],id[u]);for(int j=1;j<=vt;j++) Adde(stp+i,sts+V[j]);vt=0;Query(1,1,n,id[v],id[v]);for(int j=1;j<=vt;j++) Adde(stt+V[j],stp+i);}for(int i=1;i<=edp;i++)if(!dg[i]) S[++st]=i;while(st){u=S[st--];for(int i=hd[u];~i;i=e[i].nxt){v=e[i].v;dg[v]--;if(!dg[v]) S[++st]=v;}}for(int i=1;i<=edp;i++){if(dg[i]){puts("No");return;}}puts("Yes");
}
signed main(){int TT;scanf("%d",&TT);while(TT--) Solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/783128.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《软件性能测试分析与调优实践之路》(第2版) 读书笔记(一)总体介绍(上)-真正从性能分析与调优来看性能测试

《软件性能测试分析与调优实践之路》(第2版) 是清华大学出版社出版的一本图书,作者为张永清,全书共分为9章,如下图所示 图书介绍:《软件性能测试分析与调优实践之路》(第2版) 1、为什么需要性能测试与分析 1)、了解系统的各项性能指标,通过性能压测来了解系统能承受多大…

人人都能搞定的大模型原理 - 神经网络

​人工智能的发展起步于1950年,期间经历了各种里程碑和变革,与此相关的神经网络技术也从最初的单层感知到复杂的层级和卷积神经网络一路创新和变革,不断推动人工智能领域的发展,直到 2022 年 ChatGPT 的问世,彻底引爆了大众的目光。 人工智能技术经历了漫长的迭代过程,无…

SpringBoot优雅开发REST API最佳实践

接口服务主要由两部分组成,即参数(输入)部分,响应(输出)部分。其中在SpringBoot中主要是Controller层作为API的开发处,其实在架构层面来讲,Controller本身是一个最高的应用层,它的职责是调用、组装下层的interface服务数据,核心是组装和调用,不应该掺杂其他相关的逻…

开源的 P2P 跨平台传文件应用「GitHub 热点速览」

起初,我以为这是“微软菩萨”降临,但玩了一圈下来,发现实际效果并没有那么惊艳,还没上周热门的开源项目有趣。例如,基于 WebRTC 的文件传输平台 ShareDrop,只需打开网页,就能在局域网或互联网上安全地跨设备传文件。而可自建支持目标检测和安全报警的视频监控平台 Friga…

删除个文件夹,vfs2上传文件到ftp就异常553,这么不经事吗

开心一刻 今天逛街碰到街头采访,一上来就问我敏感话题 主持人:小哥哥,你单身吗 我:是啊 主持人:你找女朋友的话,是想找一个小奶猫呢,还是小野猫呢 我沉思了一下,叹气道:如果可以的话,我想找个人,而且是女人上传文件 基于 commons-vfs2 实现文件到 FTP 服务器的上传,…

8.13信息学集训_数据结构

目录P1981 [NOIP2013 普及组] 表达式求值P1449 后缀表达式P5788 【模板】单调栈P1886 滑动窗口 /【模板】单调队列P1901 发射站P1540 [NOIP2010 提高组] 机器翻译P2085 最小函数值P6033 [NOIP2004 提高组] 合并果子 加强版P1631 序列合并P2251 质量检测P1305 新二叉树B3631 单向…

Windows Server 2025 中文版、英文版下载 (Inside Preview, updated Aug 2024) - 下一代 Windows 11 Server

Windows Server 2025 中文版、英文版下载 (Inside Preview, updated Aug 2024) - 下一代 Windows 11 ServerWindows Server 2025 中文版、英文版下载 (Inside Preview, updated Aug 2024) - 下一代 Windows 11 Server Windows Server 2025 正式版发布在即 请访问原文链接:http…

如何让您的 .NET应用程序更智能-- 请参加 8.20 的 .NET Conf--Focus on AI

Microsoft 将于 2024 年 8 月 20 日举办免费的 .NET Conf: Focus on AI。该虚拟活动为开发人员提供了如何集成 .NET 和 AI 以增强应用程序开发和用户体验的见解,其中包括专家和行业领导者的会议。 为什么你不应该错过这个活动? .NET Conf: Focus 系列由全年举行的小型现场活…

如何让您的 .NET应用程序更智能-- 请参加 8.20 的 .NET Conf ndash; Focus on AI

Microsoft 将于 2024 年 8 月 20 日举办免费的 .NET Conf: Focus on AI。该虚拟活动为开发人员提供了如何集成 .NET 和 AI 以增强应用程序开发和用户体验的见解,其中包括专家和行业领导者的会议。为什么你不应该错过这个活动?.NET Conf: Focus 系列由全年举行的小型现场活动…

如何让您的 .NET应用程序更智能-- 请参加 8.20 的 .NET Conf -- Focus on AI

Microsoft 将于 2024 年 8 月 20 日举办免费的 .NET Conf: Focus on AI。该虚拟活动为开发人员提供了如何集成 .NET 和 AI 以增强应用程序开发和用户体验的见解,其中包括专家和行业领导者的会议。为什么要参加?.NET Conf: Focus 系列由全年举行的小型现场活动组成。8 月 20…

读零信任网络:在不可信网络中构建安全系统17无控制器架构

无控制器架构1. 建立系统框图 1.1. 实现零信任网络的第一步重要工作是建立系统框图 1.2. 系统框图能够帮助我们透彻地理解内部网络和外部网络间的通信模式,有助于系统通信信道的设计 1.3. 对于现有的网络来说,建议首先利用日志工具来记录网络流量,然后观察通信信息的流向,一…

计算机体系结构技术杂谈(下)

计算机体系结构技术杂谈(下) 2.8 加速Transformer:稀疏注意力加速器分析 1. 稀疏注意力加速器简介 近年来, Transformer模型在深度学习的各个领域,包括自然语言处理、图像分类、图像及语音生成等方面,都取得了远超于传统神经网络模型的表现。最近的ChatGPT和各类基于Tran…