首页 > TAG信息列表 > P3224
P3224 [HNOI2012]永无乡(合并线段树)
Jisoo 这是一种叫线段树合并的东西。 为了简化,我们需要动态开点。 并且一开始为每一个节点建一个线段树,当然是动态开点的 然后合并就行了,相同的线段树节点加起来,只有一个有的就返回另一个 记一个根,并且并查集一下。 #include<cstdio> #include<iostream> #include<cstring> #incluP3224 [HNOI2012]永无乡 题解
P3224 [HNOI2012]永无乡 题解 题意概括 有若干集合,每个集合最初包含一个值,和一个编号1~n。两个操作:合并两个集合,查询包含值x的集合中第k大值最初的集合编号。 思路 维护集合之间关系显然用并查集,但怎么处理询问,如果只是问最大值,那么显然可以用线段树把最大值存在并查集的祖先上,当题解 P3224 [HNOI2012]永无乡
题目链接 前置知识:kruskal 重构树,主席树 来讲一种目前题解区里没有,使用 kruskal 重构树和主席树,且时间复杂度为一个 log 的做法。 题目大意是给定一张点数为 \(n\) ,初始边数为 \(m\) 的无向图,图中每个点有一个权值,然后有 \(q\) 个操作,每个操作可能是询问与点 \(x\) 联通的P3224 [HNOI2012]永无乡(线段树合并)
支持加边和询问连通块第k大点权。 线段树合并即可。 //线段树合并 //每次合并两个连通块的权值线段树 //询问第k大 #include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; const int M=maxn*100; int c[M],lson[M],rson[M],T[maxn],tot; void pushup (int newRoP3224 [HNOI2012]永无乡 并查集+线段树合并
原题链接:https://www.luogu.com.cn/problem/P3224 目录 题意分析Code 题意 分析 和主席树操作有些像,查询区间K大,但这题又带上了修改,因此我们考虑用线段树合并。直接开n个权值线段树,然后用并查集维护当前连通块。由于这题比较模板,就不多解释了。 Code #include <bits/std