首页 > 其他分享 >P9520 [JOISC2022] 监狱

P9520 [JOISC2022] 监狱

时间:2024-08-13 08:54:06浏览次数:8  
标签:监狱 连边 囚犯 int JOISC2022 maxn et 节点 P9520

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;
}

标签:监狱,连边,囚犯,int,JOISC2022,maxn,et,节点,P9520
From: https://www.cnblogs.com/DeepSeaSpray/p/18356152

相关文章

  • 监狱AI视频分析监控算法方案 YOLOv3
    监狱AI视频分析监控算法方案可以对现场人员行为及物体状态进行实时分析识别,监狱AI视频分析监控算法方案对监控画面中特殊区域入侵监测、睡岗脱岗监测、越界监测、人员异常徘徊监测、视频骤变监测、攀高识别、跌倒检测、夜间起床识别、打架斗殴检测、异常速度监测、遗留物监测等......
  • 监狱教育的智能化:从痛点到亮点 太普软件如何优化监狱谈话教育
    在数字化浪潮中,太普软件引领监狱教育改造进入智能化新时代。我们以创新的管理系统,解决传统监狱谈话教育的痛点,提升改造效率,助力罪犯顺利回归社会。太普软件,用技术革新监狱管理,开启个别谈话教育的新篇章。个别谈话——提高监狱教育改造质量和效率概念:罪犯个别教育的概念就......
  • P9527 [JOISC2022] 洒水器 题解
    题目传送门以下设\(\operatorname{dis}(x,y)\)表示树上\(x,y\)两点间的距离。修改时对\(u\)的周围与\(u\)距离小于等于\(d\)的点的点权乘\(w\)。暴力不行,于是考虑打标记。注意到\(0\led\le40\),一个很自然的想法是:设\(tag(x,i)\)表示将\(x\)的子树内与\(x\)......
  • [JOISC2022] 团队竞技
    分析首先这道题本质上离不开一个思想,就是我们贪心地选择最大的\(a_i+b_j+c_k\)的\(i,j,k\),但是碍于题目的限制,外加观察样例会发现有一些人是永远不可能选择的,例如样例\(1\)中的第\(3\)人,他的\(b_i,c_i\)都是最大的,不管剩余\(2\)人如何选,总是不满足题意。因此,如果某个......
  • 使用 chroot 监狱限制 SSH 用户访问指定目录
    使用chroot监狱限制SSH用户访问指定目录将SSH用户会话限制访问到特定的目录内,特别是在web服务器上,这样做有多个原因,但最显而易见的是为了系统安全。为了锁定SSH用户在某个目录,我们可以使用chroot机制。在诸如Linux之类的类Unix系统中更改root(chroot)是将特定用户操......
  • 『题解』JOISC2022B 京都観光 (Sightseeing in Kyoto)
    AtCoder题目链接Luogu题目链接观察题目,不自觉地想到了dp,但是再一看\(\text{1e5}\)数据范围,意识到大概是\(2^{\text{1e5}}\)的复杂度,绝望了……然后就很自然地想到了最优策略。(思路很巧妙但是我当时没想到。)考虑有三行(或三列),分别记为\(i,j,k\),如果\(j>i\landj>......
  • 监狱
    题目链接:[JOISC2022Day1]监狱本题的思路并不刁钻,但十分考验代码能力,因此本蒟蒻尽量讲的仔细一点,尽量串联起思路与代码中的重点,当然也方便本人加深理解。Analysis:首先对于两个的罪犯,我们思考他们在什么情况下不合法,无非以下几种:两个囚犯路径有重合,且相向而行。两......
  • 数字孪生监狱 构建智慧监所三维可视化综管系统
    建设背景监狱肩负着戒治管理、维持监所安全稳定等职责,目前全国有监管场所5500多个,监狱680多个。 近年来,司法部不断加大司法行政改革力度,持续推进“数字法治,智慧司法”......
  • java和vue的狱警管理系统监狱系统狱务管理系统
    简介狱警管理系统监狱系统狱务管理系统,主要是管理罪犯教育改造、劳动改造、案件管理,罪犯信息管理等演示视频​​https://www.bilibili.com/video/BV1VG411P7YL/?zw&vd_sour......
  • java和vue的狱警管理系统监狱系统狱务管理系统
    简介狱警管理系统监狱系统狱务管理系统,主要是管理罪犯教育改造、劳动改造、案件管理,罪犯信息管理等演示视频https://www.bilibili.com/video/BV1VG411P7YL/?zw&vd_sourc......