题目大意:

在$n$个带权点上维护两个操作:

  1)在点$u,v$间连一条边;

  2)询问点$u$所在联通块中权值第$k$小的点的编号,若该联通块中的点的数目小于$k$,则输出$-1$;


传送门

上周的模拟赛在一道线段树合并的题目上gg了,来学习一个。

对每一个联通块,我们维护一棵权值线段树。查询时,若左子树大小大于等于$k$进入左子树,否则进入右子树;

因为每棵线段树同构,所以对于任意两棵线段树可以进行合并操作:

 int merge(int x,int y){
if(!x)return y;
if(!y)return x;
t[x].lson=merge(t[x].lson,t[y].lson);
t[x].rson=merge(t[x].rson,t[y].rson);
t[x].s=t[t[x].lson].s+t[t[x].rson].s;
return x;
}

利用并查集判断两个点是否连通,若不联通,则合并两个联通块的线段树即可;

代码:

 #include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cctype>
#define foru(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
const int N=1e5+; struct node{int s,lson,rson;}t[N*];
int n,m,a[N],f[N],fx,fy,cnt,rt[N],idx[N]; int gf(int k){return k==f[k]?k:f[k]=gf(f[k]);} int read(){
static int f,x;static char ch;
x=f=;ch=getchar();
while(!isdigit(ch)){f=(ch=='-');ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return f?-x:x;
} #define ls t[k].lson
#define rs t[k].rson
#define mid ((L+R)>>1) void upd(int &k,int L,int R,int p){
if(p<L||p>R)return;
if(!k)k=++cnt;
if(L==R){t[k].s=;return;}
upd(ls,L,mid,p);upd(rs,mid+,R,p);
t[k].s=t[ls].s+t[rs].s;
} int query(int k,int L,int R,int p){
if(L==R)return L;
if(t[ls].s<p)return query(rs,mid+,R,p-t[ls].s);
return query(ls,L,mid,p);
} int merge(int x,int y){
if(!x)return y;
if(!y)return x;
t[x].lson=merge(t[x].lson,t[y].lson);
t[x].rson=merge(t[x].rson,t[y].rson);
t[x].s=t[t[x].lson].s+t[t[x].rson].s;
return x;
} int main(){
//freopen("1.in","r",stdin);
memset(t,,sizeof(t));
n=read();m=read();
foru(i,,n)a[i]=read(),f[i]=i;
foru(i,,m){
fx=gf(read());fy=gf(read());
f[fx]=fy;
}
foru(i,,n){
upd(rt[gf(i)],,n,a[i]);
idx[a[i]]=i;
}
int q=read(),x,y;
char ch[];
while(q--){
scanf("%s%d%d",ch,&x,&y);
fx=gf(x);fy=gf(y);
if(ch[]=='Q')
printf("%d\n",t[rt[fx]].s>=y?idx[query(rt[fx],,n,y)]:-);
else if(fx!=fy){
f[fx]=fy;
rt[fy]=merge(rt[fx],rt[fy]);
}
}
return ;
}

BZOJ2733 [HNOI2012]永无乡(并查集+线段树合并)的更多相关文章

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

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

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

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

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

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

  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. bzoj2733: [HNOI2012]永无乡(splay)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3778  Solved: 2020 Description 永 ...

  8. bzoj2733: [HNOI2012]永无乡 启发式合并

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 题目: 2733: [HNOI2012]永无乡 Time Limit: 10 Sec   ...

  9. [Bzoj2733][Hnoi2012] 永无乡(BST)(Pb_ds tree)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4108  Solved: 2195[Submit][Statu ...

随机推荐

  1. CDH6.2安装配置第二篇:CDH安装的前期配置

    本篇介绍cdh安装之前需要的一些必要配置,当然这些配置也可以用shell脚本来配置.在安装之前请先配置好yum源,在文中用的统一都是阿里源.在安装的时候,要确保主机的内存是4G以上,要不然会无限重启c ...

  2. PHP+InfiniteScroll实现网页无限滚动加载数据实例

    PHP+InfiniteScroll实现网页无限滚动加载数据实例,实现原理:当滚动条到底离网页底部一定长度的时候,向后台发送页数并获取数据. 首先我们在页面上先放置10条数据,即第一页,每一项都是p标 ...

  3. Class.forName(String className)解析

    功能: Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类, 也就是说JVM会执行该类的静态代码段 一 ...

  4. SQLServer多条件查询技巧

    2019-10-15  13:31:04 在实际项目开发中,有很多页面都会出现多条件查询功能,类似于这种情况: 牵扯到数据就少不了数据库了.这么多条件的查询,如果要用常规的if else来写判断逻辑的 ...

  5. 增删改查(简单版&连接数据库)

    这个博客也是补充之前的学习内容: 项目总述:这个增删改查我以,选课名称,选课教室,选课教师基本信息,作为主要的信息来源.主要对这些信息最基本的增删改查 详细的分析与说明: 1.首先在src文件里定义四 ...

  6. 洛谷 P2871 [USACO07DEC]手链Charm Bracelet && 01背包模板

    题目传送门 解题思路: 一维解01背包,突然发现博客里没有01背包的板子,补上 AC代码: #include<cstdio> #include<iostream> using ...

  7. 更改php.ini配置

    vi /etc/php.ini #编辑修改 @ini_set('memory_limit',        '64M');                                      / ...

  8. Apache添加ssl支持

    安装证书文件说明:1. 证书文件xxx.pem,包含两段内容,请不要删除任何一段内容.2. 如果是证书系统创建的CSR,还包含:证书私钥文件xxx.key.证书公钥文件public.pem.证书链文件 ...

  9. 107.JsonResponse

    JsonResponse类: 用来dump字符串成json字符串,然后返回将json字符串封装成Response对象返回给浏览器,并且它的Content-Type是application/json.示 ...

  10. Linux上创建RStudio快捷方式

    在Linux平台上经常会有一些软件需要通过命令行的方式启动,这没有图标启动方便,下面是在Linux平台为RStudio创建图标链接的方法: 下面以在桌面上创建RStudio快捷方式为例: (1) 首先 ...