#线段树合并#洛谷 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 ...
随机推荐
- 案例分享:Qt国产麒麟系统某防“某显示控制项目”(多类设备自动化流程控制,数据分析整合与展示,定位图,深度图,热力图等,多应用协调管控,健壮容错)
喜报 我司承担的某防"某显示控制项目",已于近日顺利通过湖底验收. 需求 功能简介: 1.多类设备的显示.控制与管理 2.数据的分析与展示,定位图.深度图.热力图等 ...
- 【Azure 应用服务】收集App Service 关于Availability Zone, Health check 以及 Traffic Manager的文档,并了解高可用(HA)和灾备(DR)
问题描述 收集App Service 关于Availability Zone, Health check 以及 Traffic Manager的文档,并了解高可用(HA)和灾备(DR)的具体办法 问题 ...
- 【Azure 应用服务】App Service中抓取 Web Job 的 DUMP 办法
问题描述 使用Azure App Service,也可以部署一个Java程序作为Web Job运行.运行一个 .Jar 文件只需要以下4步: 1)把Java应用打包成一个 .jar 文件 2)创建一个 ...
- 一文详解云上自动化部署集群管理工具 Nebula Operator
本文首发于 Nebula Graph 公众号:Nebula Operator 开源啦!一文详解这个云上自动化部署集群管理工具 在介绍 Nebula Operator 之前,让我们先来了解下什么是 Op ...
- 使用rpa打开浏览器并执行js抓取页面元素详情步骤
这里我们专门开一个文章来写如何在rpa中执行js获取页面元素. 个人觉得,复杂点的需求用js会方便很多,所以后续的文章我都会重点使用js去获取页面元素. 好,正文开始,我们先看一下rpa为我们提供的自 ...
- 关闭mysql上锁的表/数据
一.输入查询语句,查看是否有数据被上锁 select * from information_schema.innodb_trx; 取 trx_mysql_thread_id 字段值 kill < ...
- Java 异常整合练习
1 package com.bytezero.throwable2; 2 3 /** 4 * 5 * @Description 异常练习 6 * @author Bytezero·zhenglei! ...
- docker构建带ik分词器Elasticsearch镜像
创建Dockerfile 文件: FROM elasticsearch:7.4.2 RUN cd /usr/share/elasticsearch && sh -c '/bin/ech ...
- autohotkey 设置快捷键 设置光标位置 (ctrl + alt + Numpad0)
autohotkey 设置快捷键 设置光标位置 (ctrl + alt + Numpad0) 原因 3个屏幕,所以鼠标设置的灵敏度非常高,经常就找不到鼠标在哪了. 设置个快捷键,让鼠标每次都初始化一个 ...
- C++学习笔记之编程思想
目录 编程思想 单例(Singleton)模式 观察者(Observer)模式 void*.NULL和nullptr C的类型转换 C++的类型转换 适配器(Adapter)模式 泛型编程的思想 模板 ...