首页 > 其他分享 >一类链式并查集问题

一类链式并查集问题

时间:2024-03-05 23:22:18浏览次数:30  
标签:le 颜色 int 查集 fa 链式 一类 河流 op

链接:https://ac.nowcoder.com/acm/contest/69510/G
来源:牛客网

你在一个星球上,外星人amiloac想让你管理一条河流,该河流有\(x\)段,每两段之间有一个挡板隔开,每一段都有各自的颜色\(a\)。你需要管理\(q\)天,每一天你需要做以下的一种操作。

\(1\ l\ r\)将第\(l\)至\(r\)段河流的所有未打开的挡板打开。

\(2\ x\)询问你第\(x\)段河流的颜色是什么。

对于任意相邻的两段,它们之间的隔板被打开后的瞬间,河流的颜色会混合变成颜色最深的河流的颜色,\(a\)越大,颜色越深。

注:隔板打开后,河流的段数不会变。请注意不同寻常的空间限制!

第一行为两个整数\(n,q(1\le n \le 5 \cdot 10^5),(1\le q\le 5 \cdot 10^5)\),分别表示河流的段数和管理的天数。
第二行为\(n\)个整数\(a_i(1\le i\le n),(1\le a_i\le 10^9)\),表示每一段河流的颜色。
接下来\(q\)行每行第一个数\(op(1\le op\le 2)\)表示操作:
如果\(op=1\),则给出两个数\(l,r(1\le l\le r\le n)\),表示你需要将第\(l\)至\(r\)段河流的所有未打开的挡板打开;
如果\(op=2\),则给出一个数\(x(1\le x\le n)\),表示询问你第\(x\)段河流的颜色是什么。
对于每次操作\(2\),输出一个整数\(ans\),表示第\(x\)段河流的颜色。

解法:并查集。

每一次打开挡板,便将当前的河段与下一段河流合并,然后跳到下一段尚未与当前河段合并的河流继续合并。
本题卡空间把线段树卡掉了。

int n, m;
int a[N];
int fa[N];
int nx[N];
int get(int x) { return x == fa[x] ? x : fa[x] = get(fa[x]) ; }
void solve(){
	int q;cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)fa[i]=i,nx[i]=i+1;
	for(int i=1;i<=q;i++){
		int op;cin>>op;
		if(op==1){
			int l,r;cin>>l>>r;
			int g;
			while(nx[get(l)]<=r){
				int x=get(l),y=get(nx[x]);
				fa[x]=y;
				a[y]=max(a[x],a[y]);
				//nx[l]表示下一个和l不在同一个连通块的点
				//nx[get(l)]表示下一个和l的的根节点的点
				//本质上根节之间跳来跳去
				l=nx[x];
			}
		}
		else {
			int x;cin>>x;
			  cout << a[get(x)] << '\n' ;
		}
	}
}

标签:le,颜色,int,查集,fa,链式,一类,河流,op
From: https://www.cnblogs.com/mathiter/p/18055536

相关文章

  • 带权并查集板子
    以一道区间和查询来说明板子如何使用1.merge的时候只需要维护两个根节点的距离,利用的是合并时题目给的信息2.find的时候更新维护是子节点到根的距离3.需要加一个查询函数,因为距离数组是开在结构体内部的。题目描述对于一个长度为\(N\)的整数数列\(A_{1},A_{2},\cdotsA_......
  • 程序自动分析—并查集
    Description在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件......
  • 信息传递(题解)[并查集]
    题目题目描述有n个同学(编号为1到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学。游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有......
  • 并查集(模板介绍+路径压缩)
    并查集(模板介绍+路径压缩)题面P3367并查集题目描述如题,现在有一个并查集,你需要完成合并和查询操作。第一行包含两个整数N,M,表示共有N个元素和M个操作。接下来M行,每行包含三个整数Z,X,Y。当Z=1时,将X与Y所在的集合合并。当Z=2时,输出Z与Y是否在同一集合内,是的输出Y;否则输出N......
  • 实现一个链式调用的query方法
    提供了一个数组结构的data,要求实现一个query方法,返回一个新的数组,query方法内部有过滤、排序、分组等操作,并且支持链式调用,调用最终的execute方法返回结果你可以按照以下步骤实现这个query方法:定义一个数组结构的data,例如:constdata=[{id:1,name:'Ali......
  • offline RL | HIM:基于 hindsight 的 RL 是一类大 idea
    题目:GeneralizedDecisionTransformerforOfflineHindsightInformationMatching,ICLR2022,688spotlight。其中一个8分是从5分rebuttal上来的;貌似对于其他reviewer,rebuttal也提分很多。pdf版本:https://arxiv.org/pdf/2111.10364.pdfhtml版本:https://ar5iv.lab......
  • CF776D(并查集思想)
    难度1em还是一道比较套路的题目。观察发现,如果当\(r_{i}=1\)时他的两把钥匙状态是相同的,当\(r_{i}=0\)时他的两把钥匙状态是不同的,对于这种相同不同的问题可以考虑并差集,状态一样就一样的并在一起,否则就把不一样的并在一起所以以后看见这些问题(a=b+k,a=!b,a=b)都可以用带权并查......
  • 并查集+建图 同样是逆向思维 和星球大战类似
    L2-013红色警报分数25作者 陈越单位 浙江大学战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改......
  • 并查集
    作用:1.将两个集合合并2.询问两个元素是否在一个集合当中基本原理:每个集合用一棵树来表示,树根的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示x的父节点操作:1.判断树根:if(p[x]==x);2.求x的集合编号:while(p[x]!=x)x=p[x];3.如何合并两个集合:p[x]是x的集合编......
  • ABC302Ex Ball Collector (可撤销并查集)
    由于博客园存在关站风险,文章以后同步发在这里,可能会有更好的阅读体验。首先我们分析一下,如果我们已经知道了要走哪些点,我们可以怎么做。考虑将\(a_i,b_i\)之间连边,发现题目可以被转化为给定一个图,要求对于每条边将其一个顶点染色,问最多能将多少个点染色。于是我们对于每个连......