题意:给定N个节点,K次操作,操作有两种,1是合并两个集合,2是求某个集合的第K大(从小到大排序)。

思路:合并只要启发式即可。此题可以用线段树,保存1到N的排序的出现次数和。 复杂度O(NlogN)。想象一下,当其中一棵树节点少的时候,复杂度是O(logN)的,次数不超过N次;当两棵树的节点都蛮多的时候,复杂度是O(N)的,但是这样的合并能使得集合变得很大,显然这样的合并次数非常少,小于logN次。

所以合并线段树的总复杂度就算O(NlogN),每次询问K大的操作是线段树常规操作,单词复杂度是logN的

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int rt[maxn],ls[maxn],rs[maxn],fa[maxn],cnt;
int a[maxn],id[maxn],sum[maxn];
int find(int u){
if(fa[u]!=u) fa[u]=find(fa[u]);
return fa[u];
}
void insert(int &Now,int L,int R,int pos)
{
if(!Now) Now=++cnt; sum[Now]++;
if(L==R) return ;int Mid=(L+R)>>;
if(pos<=Mid) insert(ls[Now],L,Mid,pos);
else insert(rs[Now],Mid+,R,pos);
}
int merge(int x,int y){
if(!x) return y;
if(!y) return x;
ls[x]=merge(ls[x],ls[y]);
rs[x]=merge(rs[x],rs[y]);
sum[x]=sum[ls[x]]+sum[rs[x]];
return x;
}
int query(int x,int L,int R,int num){
if(L==R) return L; int Mid=(L+R)>>;
if(sum[ls[x]]>=num) return query(ls[x],L,Mid,num);
return query(rs[x],Mid+,R,num-sum[ls[x]]);
}
int main()
{
int N,M,K,u,v; char opt[];
scanf("%d%d",&N,&M);
rep(i,,N) scanf("%d",&a[i]),id[a[i]]=i;
rep(i,,N) fa[i]=i;
rep(i,,M) {
scanf("%d%d",&u,&v);
int p=find(u),q=find(v);
if(p!=q) fa[p]=q;
}
scanf("%d",&K);
rep(i,,N) insert(rt[find(i)],,N,a[i]);
rep(i,,K){
scanf("%s%d%d",opt,&u,&v);
if(opt[]=='B'){
int p=find(u),q=find(v);
if(p!=q){
fa[q]=p;
rt[p]=merge(rt[p],rt[q]);
}
}
else {
int p=find(u);
if(sum[rt[p]]<v) puts("-1");
else printf("%d\n",id[query(rt[p],,N,v)]);
}
}
return ;
}

BZOJ- 2733: 永无乡 (并查集&线段树合并)的更多相关文章

  1. bzoj 2733 永无乡 - 并查集 - 线段树

    永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛. ...

  2. BZOJ2733 [HNOI2012]永无乡(并查集+线段树合并)

    题目大意: 在$n$个带权点上维护两个操作: 1)在点$u,v$间连一条边: 2)询问点$u$所在联通块中权值第$k$小的点的编号,若该联通块中的点的数目小于$k$,则输出$-1$: 传送门 上周的模 ...

  3. B20J_2733_[HNOI2012]永无乡_权值线段树合并

    B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...

  4. 【洛谷P3224】永无乡 并查集+Splay启发式合并

    题目大意:给定 N 个点的图,点有点权,初始有一些无向边,现在有 Q 个询问,每个询问支持动态增加一条无向边连接两个不连通的点和查询第 X 个点所在的联通块中权值第 K 大的是哪个点. 题解:学会了平 ...

  5. BZOJ 3910 并查集+线段树合并

    思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...

  6. bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)

    [HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio&g ...

  7. 【HNOI2012】永无乡 题解(并查集+线段树合并)

    题目链接 给定一张含$n$个点$m$条边的无向图,每个点有一个重要指数$a_i$.有两种操作:1.在$x$和$y$之间连一条边:2.求$x$所在连通块中重要程度第$k$小的点. ----------- ...

  8. [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并

    永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...

  9. Codeforces Gym 101194G Pandaria (2016 ACM-ICPC EC-Final G题, 并查集 + 线段树合并)

    题目链接  2016 ACM-ICPC EC-Final Problem G 题意  给定一个无向图.每个点有一种颜色. 现在给定$q$个询问,每次询问$x$和$w$,求所有能通过边权值不超过$w$的 ...

  10. BZOJ 2733 永无乡

    splay启发式合并 启发式合并其实就是把集合数量小的合并到集合数量大的里去. 怎么合并呢,直接一个一个插入就行了.. 用并查集维护连通性,find(i)可以找到所在splay的编号 这题好像还可以合 ...

随机推荐

  1. oracle 函数 截取 连接 替换 判断

    一个处理不规范日期的函数,廖记一下吧,以免再忘. --注意全角半角 CREATE OR REPLACE function f_str2form( date_string in varchar2 ) r ...

  2. __init__和__new__

    一.__init__方法是什么 __init__方法通常用在初始化一个类实例的时候, class Person(object): """Silly Person" ...

  3. Java 集合系列13之 TreeMap详细介绍(源码解析)和使用示例

    转载 http://www.cnblogs.com/skywang12345/p/3310928.html https://www.jianshu.com/p/454208905619

  4. android 加固防止反编译-重新打包

    http://blog.csdn.net/u010921385/article/details/52505094 1.需要加密的Apk(源Apk) 2.壳程序Apk(负责解密Apk工作) 3.加密工具 ...

  5. 主攻ASP.NET.4.5.1 MVC5.0之重生:空地搭建一个包含 Ninject框架 项目

    1.创建一个空白解决方案 2.添加一个类库 名称为XXX.Domain 3.添加一个ASP.MVC 名称为XXX.WebUI 4.选着空模版,勾选MVC核心引用 5.添加单元测试项目XXX.UntiT ...

  6. 主攻ASP.NET MVC4.0之重生:上下滑动屏幕动态加载数据

                @{ ViewBag.Title = "Index"; } <!DOCTYPE html> <html> <head> ...

  7. Plist文件与数据解析

    综述 初步阶段当我们做个需要点数据的练习时(比如购物商品展示),我们可能是将数据直接写在代码中,比如说定义一个字符串数组或存放字典的数组.但这其实并不是一种合理的做法.因为如果当数据修改的时候,就要经 ...

  8. poj 3468 线段树模板题

    #include<iostream> #include<algorithm> #include<stdio.h> using namespace std; #def ...

  9. Could not fetch URL https://pypi.org/simple/pip/: There was a problem confir

    这个问题其实是无意中解决的:因为在网上找不到解决办法,是我在yum -y installl wget后,自动就好了,安装wget的时候,可能更新了openssl的缘故吧.

  10. Navicat 导入Excel与增加主键

    1.当你需要导入某Excel文件时,你必须把这个lxsl文件用Excel先打开(与其他软件的导入有点不太,其他会报错已占用之类的) 2.设置主键 当你打开你导入的Excel文件时,会显示无主键,需要你 ...