#线段树合并#洛谷 3224 [HNOI2012]永无乡
分析
和主席树不同的是,线段树合并后原树的信息不会保留,
这样就保证空间和常数都比较小,这题比较裸,直接上代码
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=100011; int Tree_Tot;
int n,m,rt[N],w[N*20],p[N*20];
int Ls[N*20],Rs[N*20],f[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline signed getf(int u){return f[u]==u?u:f[u]=getf(f[u]);}
inline signed update(int k,int l,int r,int x,int z){
if (!k) k=++Tree_Tot;
if (l==r) {w[k]=1,p[k]=z; return k;}
rr int mid=(l+r)>>1;
if (x<=mid) Ls[k]=update(Ls[k],l,mid,x,z);
else Rs[k]=update(Rs[k],mid+1,r,x,z);
w[k]=w[Ls[k]]+w[Rs[k]];
return k;
}
inline signed Merge(int fi,int se,int l,int r){
if (!fi||!se) return fi|se;
if (l==r) {if (p[se]) p[fi]=p[se],w[fi]+=w[se]; return fi;}
rr int mid=(l+r)>>1;
Ls[fi]=Merge(Ls[fi],Ls[se],l,mid);
Rs[fi]=Merge(Rs[fi],Rs[se],mid+1,r);
w[fi]=w[Ls[fi]]+w[Rs[fi]];
return fi;
}
inline signed query(int k,int l,int r,int kth){
if (w[k]<kth||!k) return 0;
if (l==r) return p[k];
rr int mid=(l+r)>>1;
if (kth<=w[Ls[k]]) return query(Ls[k],l,mid,kth);
else return query(Rs[k],mid+1,r,kth-w[Ls[k]]);
}
signed main(){
n=iut(); m=iut();
for (rr int i=1;i<=n;++i)
f[i]=i,rt[i]=update(rt[i],1,n,iut(),i);
for (rr int i=1;i<=m;++i){
rr int fa=getf(iut()),fb=getf(iut());
if (fa==fb) continue;
if (fa>fb) fa^=fb,fb^=fa,fa^=fb;
f[fa]=fb,rt[fb]=Merge(rt[fb],rt[fa],1,n);
}
for (rr int Q=iut();Q;--Q){
rr char c=getchar();
while (c!='B'&&c!='Q') c=getchar();
if (c=='B'){
rr int fa=getf(iut()),fb=getf(iut());
if (fa==fb) continue;
if (fa>fb) fa^=fb,fb^=fa,fa^=fb;
f[fa]=fb,rt[fb]=Merge(rt[fb],rt[fa],1,n);
}else{
rr int x=getf(iut()),kth=iut();
rr int t=query(rt[x],1,n,kth);
if (!t) printf("-1"); else print(t);
putchar(10);
}
}
return 0;
}
#线段树合并#洛谷 3224 [HNOI2012]永无乡的更多相关文章
- 洛谷.3224.[HNOI2012]永无乡(Splay启发式合并)
题目链接 查找排名为k的数用平衡树 合并时用启发式合并,把size小的树上的所有节点插入到size大的树中,每个节点最多需要O(logn)时间 并查集维护连通关系即可 O(nlogn*insert t ...
- 洛谷 P3224 [HNOI2012]永无乡 解题报告
P3224 [HNOI2012]永无乡 题目描述 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 \(n\) 座岛排名,名次用 ...
- 洛谷P3224 [HNOI2012]永无乡(线段树合并+并查集)
题目描述 永无乡包含 nnn 座岛,编号从 111 到 nnn ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 nnn 座岛排名,名次用 111 到 nnn 来表示.某些岛之间由巨大的桥连接, ...
- 2018.08.11 洛谷P3224 [HNOI2012]永无乡(线段树合并)
传送门 给出n个带点权的点,支持连边和查询连通块第k大. 这个貌似就是一道线段树合并的裸板啊... 代码: #include<bits/stdc++.h> #define N 100005 ...
- 洛谷 P3224 [HNOI2012]永无乡
题面 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 \(n\) 座岛排名,名次用 \(1\) 到 \(n\) 来表示.某些岛 ...
- [洛谷P3224][HNOI2012]永无乡
题目大意:给你$n$个点,每个点有权值$k$,现有两种操作: 1. $B\;x\;y:$将$x,y$所在联通块合并2. $Q\;x\;k:$查询第$x$个点所在联通块权值第$k$小是哪个数 题解:线段 ...
- [Luogu 3224] HNOI2012 永无乡
[Luogu 3224] HNOI2012 永无乡 特别水一个平衡树题. 不认真的代价是调试时间指数增长. 我写的 SBT,因为 Treap 的 rand() 实在写够了. 用并查集维护这些点的关系, ...
- 【洛谷P3224】永无乡 并查集+Splay启发式合并
题目大意:给定 N 个点的图,点有点权,初始有一些无向边,现在有 Q 个询问,每个询问支持动态增加一条无向边连接两个不连通的点和查询第 X 个点所在的联通块中权值第 K 大的是哪个点. 题解:学会了平 ...
- B20J_2733_[HNOI2012]永无乡_权值线段树合并
B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...
- [HNOI2012]永无乡 线段树合并
[HNOI2012]永无乡 LG传送门 线段树合并练手题,写这篇博客只是为了给我的这篇文章找个板子题. 并查集维护连通性,对于不在同一个连通块内的合并操作每次直接合并两颗线段树,复杂度\(O(n \l ...
随机推荐
- ABP Suite创建新项目
启动Abp Suite ********************************************************************** ** Visual Studio ...
- 【Azure 应用服务】收集App Service 关于Availability Zone, Health check 以及 Traffic Manager的文档,并了解高可用(HA)和灾备(DR)
问题描述 收集App Service 关于Availability Zone, Health check 以及 Traffic Manager的文档,并了解高可用(HA)和灾备(DR)的具体办法 问题 ...
- C#多线程(7):手动线程通知
目录 区别与示例 ManualResetEvent 类 ManualResetEventSlim 区别与示例 AutoResetEvent 和 ManualResetEvent 十分相似.两者之间的区 ...
- 钉钉机器人自动关联 GitHub 发送 approval prs
摘要:用技术来解决 PM 枯燥的 approval pr 工作,本文将阐述如何自动化获取 GitHub Organization 下各个 repo 待 merge 的 pull requests 并通 ...
- 从零开始写 Docker(四)---使用 pivotRoot 切换 rootfs 实现文件系统隔离
change-rootfs-by-pivot-root.png 本文为从零开始写 Docker 系列第四篇,在mydocker run 基础上使用 pivotRoot 系统调用切换 rootfs 实现 ...
- Java开发中String.format的妙用
format方法是String类中的一个方法,主要作用是用来格式化字符串.当前做 的一个功能当中,刚好用到了这个方法,代码处理起来非常简便.因此就写篇博客 记录下来. 分析使用场景:前端App需要根据 ...
- Lock wait timeout exceeded; try restarting transaction-Mysql报错
一.问题由来 现在在做一个小程序的后台,使用Java写的,数据库使用的Mysql,之前一直调试的时候都好好的,今天在调试的时候突然就报一个错: ### Error updating database. ...
- 个性化的单芯片的回声消除(AEC)解决方案
概述 这些年随着智能化产品的广泛应用,各种新型音频产品也层出不穷,在这个古老的领域,传统的回声消除方案一般是功耗高,成本非常高,集成性差.无法满足新产品新市场对回声消除的低成本低功耗个性化需求等特 ...
- PBKDF2算法:保障密码安全的利器
PBKDF2算法起源: PBKDF2(Password-Based Key Derivation Function 2)算法是一种基于密码的密钥派生函数,最初由RSA实验室的密码学家提出,用于从密码中 ...
- Grails批改默认启动端口
Grails修改默认启动端口 Grails默认启动端口号是8080,有几种修改的方式: 一.在官网文档中有介绍: grails -Dserver.port=8090 run-app -Dserver. ...