BZOJ2733/LG3324 「HNOI2014」永无乡 权值线段树合并
问题描述
题解
对于每个结点建立一棵权值线段树。
查询操作就去查询第 \(k\) 大,合并操作就合并两颗权值线段树。
并查集维护连通性。
同时 STO hkk,zcr,zzk
\(\mathrm{Code}\)
#include<bits/stdc++.h>
using namespace std;
template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
}
template <typename Tp>
void fr(Tp &x){
char ch=1;
while(ch!='Q'&&ch!='B') ch=getchar();
if(ch=='Q') x=1;
else x=2;
}
const int maxn=100003;
int n,m,T;
int rk[maxn];
int pre[maxn];
int rt[maxn],L[maxn*22],R[maxn*22],cnt;
int val[maxn*22],fa[maxn];
void pushup(int x){
val[x]=val[L[x]]+val[R[x]];
}
int insert(int x,int l,int r,int p,int v){
if(!x) x=++cnt;
if(l==r){
val[x]+=v;
return x;
}
int mid=(l+r)>>1;
if(p<=mid) L[x]=insert(L[x],l,mid,p,v);
else R[x]=insert(R[x],mid+1,r,p,v);
pushup(x);
return x;
}
int merge(int p,int q,int l,int r){
if(!p||!q) return p+q;
if(l==r){
val[q]+=val[p];return q;
}
int mid=(l+r)>>1;
L[q]=merge(L[p],L[q],l,mid);
R[q]=merge(R[p],R[q],mid+1,r);
pushup(q);
return q;
}
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int query(int x,int l,int r,int k){
if(!x&&k) return -1;
if(r-l+1<k) return -1;
if(l==r) return l;
int mid=(l+r)>>1;
if(!L[x]&&!R[x]&&k) return -1;
if(L[x]&&val[L[x]]>=k) return query(L[x],l,mid,k);
else return query(R[x],mid+1,r,k-val[L[x]]);
}
void cz1(){
int x,k;read(x);read(k);
int xx=find(x);
int ppp=query(rt[xx],1,100000,k);
printf("%d\n",pre[ppp]);
}
void cz2(){
int x,y;read(x);read(y);
int xx=find(x),yy=find(y);
if(xx==yy) return;
fa[xx]=yy;
merge(rt[xx],rt[yy],1,100000);
}
int main(){
read(n);read(m);
for(int i=1;i<=n;i++) read(rk[i]),pre[rk[i]]=i;
for(int i=1;i<=n;i++) rt[i]=++cnt;
for(int i=1;i<=n;i++){
fa[i]=i;
insert(rt[i],1,100000,rk[i],1);
}
// #define debug1
#ifdef debug1
for(int i=1;i<=n;i++)
printf("%d %d\n",query(rt[i],1,100000,1),query(rt[i],1,100000,2));
#endif
for(int i=1,x,y;i<=m;i++){
read(x);read(y);
int xx=find(x),yy=find(y);
if(xx==yy) continue;
fa[xx]=yy;
merge(rt[xx],rt[yy],1,100000);
}
int T,op;read(T);
while(T--){
fr(op);
if(op==1) cz1();
else cz2();
}
return 0;
}
BZOJ2733/LG3324 「HNOI2014」永无乡 权值线段树合并的更多相关文章
- BZOJ 2733 [HNOI2012]永无乡 (权值线段树启发式合并+并查集)
题意: n<=1e5的图里,在线连边.查询某连通块第k大 思路: 练习线段树合并的好题,因为依然记得上一次启发式合并trie的时候内存爆炸的恐怖,所以这次还是用了动态开点.回收 听说启发式合并s ...
- B20J_2733_[HNOI2012]永无乡_权值线段树合并
B20J_2733_[HNOI2012]永无乡_权值线段树合并 Description:n座岛,编号从1到n,每座岛都有自己的独一无二的重要度,按照重要度可以将这n座岛排名,名次用1到 n来表示.某些 ...
- luogu3224 永无乡(动态开点,权值线段树合并)
luogu3224 永无乡(动态开点,权值线段树合并) 永无乡包含 n 座岛,编号从 1 到 n ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 n 座岛排名,名次用 1 到 n 来表示.某些 ...
- LOJ #2359. 「NOIP2016」天天爱跑步(倍增+线段树合并)
题意 LOJ #2359. 「NOIP2016」天天爱跑步 题解 考虑把一个玩家的路径 \((x, y)\) 拆成两条,一条是 \(x\) 到 \(lca\) ( \(x, y\) 最近公共祖先) 的 ...
- 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】
题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...
- 「HNOI2012」永无乡
传送门 Luogu 解题思路 很容易想到平衡树,然后还可以顺便维护一下连通性,但是如何合并两棵平衡树? 我们采用一种类似于启发式合并的思想,将根节点siz较小的那颗平衡树暴力的合并到另一颗上去. 那么 ...
- [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并
永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...
- 【BZOJ2733】【HNOI2012】永无乡 - 线段树合并
题意: Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通 ...
- 【BZOJ2733】永无乡[HNOI2012](splay启发式合并or线段树合并)
题目大意:给你一些点,修改是在在两个点之间连一条无向边,查询时求某个点能走到的点中重要度第k大的点.题目中给定的是每个节点的排名,所以实际上是求第k小:题目求的是编号,不是重要度的排名.我一开始差点被 ...
随机推荐
- win7+vim搭建+verilog HDL IDE
参考地址:http://www.huangdc.com/421 参考文章为2016年,部分更新贴于文章内了 安装下载vim vim在win下叫gvim,下载地址:https://www.vim.org ...
- js正则高级函数(replace,matchAll用法),实现正则替换(实测很有效)
有这么一个文档,这是在PC端显示的效果,如果放在移动端,会发现字体大小是非常大的,那么现在想让这个字体在移动端能按照某个比例缩小,后台返回的数据格式是: <html> <head&g ...
- Linux 编译工具 gcc/g++、Make/Makefile、CMake/CMakeLists.txt、qmake
前言 编译器的主要工作流程: 源码(Source Code)>> 预处理器(Preprocessor)>> 编译器(Compiler)>> 汇编程序(Assembl ...
- IT兄弟连 HTML5教程 HTML5技术的应用现状及HTML5平台的兴起
HTML5的优良特性很快被各种类型的网站利用,比如文件拖拽到网页上传功能,多数即使用HTML5提供的新属性就可以完成,来实现素材的免插件拖放.因此,HTML5技术实际上在国内已经获得了较广泛的应用与支 ...
- Delphi 10.2 Tokyo新增JSON类学习——TJsonSerializer
Delphi 10.3.2 for windows 7 编译通过,源码下载地址: Tokyo 10.2新增类,效率更高更快 TJsonSerializer 需要引用单元:System.JSON.Ser ...
- PHP JWT token实现
原文链接:https://www.jb51.net/article/146790.htm 机制: 代码如下: <?php /** * PHP实现jwt */ class Jw ...
- hive引擎的选择:tez和spark
背景 mr引擎在hive 2中将被弃用.官方推荐使用tez或spark等引擎. 选择 tez 使用有向无环图.内存式计算. spark 可以同时作为批式和流式的处理引擎,减少学习成本. 问题& ...
- Java开发桌面程序学习(八)——启动浏览器或者打开资源管理器操作与hyperlink超链接的使用
启动浏览器或者打开资源管理器 启动浏览器 java1.6版本以上,Desktop Desktop.getDesktop().browse(new URI("www.cnblogs.com/k ...
- python基础(12):函数(二)
1. 函数参数 之前我们说过了传参,如果我们需要给⼀个函数传参,⽽参数⼜是不确定的,或者我给⼀个函数传很多参数,我的形参就要写很多,很⿇烦,怎么办呢,我们可以考虑使⽤动态参数. 形参的第三种: 动态参 ...
- 5-网宿CDN客户端推流NGB
网宿NGB调度系统(类似httpdns原理)从服务端分发给客户端推流IP,实现基于APP realip精准调度模式. 参考官网介绍:https://www.wangsu.com/content/det ...