题意:
B x y B\ x\ y B x y 表示在岛 x x x 与岛 y y y 之间修建一座新桥。

Q x k Q\ x\ k Q x k 表示询问当前与岛 x x x 连通的所有岛中第 k k k 重要的是哪座岛,即所有与岛 x x x 连通的岛中重要度排名第 k k k 小的岛是哪座,请你输出那个岛的编号。

题解:
一眼题,用并查集维护一下连通块,平衡树合并时用启发式合并,合并最多也就 n l o g n nlogn nlogn次,总时间复杂度位 O ( n l o g n 2 ) O(nlogn^2) O(nlogn2)

就是写代码的时候跟失了智一样,忘加一句话多调试了三小时,愚不可及
代码:

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;const int maxn=5e5+10;int a[maxn];
int f[maxn];
int ifind(int x){if(x==f[x])  return x;return f[x]=ifind(f[x]);
}
mt19937 rnd(233);struct FHQ{int root[maxn],cnt;int ls[maxn],rs[maxn],val[maxn],key[maxn],siz[maxn];int newnode(int vals){val[++cnt]=vals;key[cnt]=rnd();siz[cnt]=1;return cnt;}void updata(int node){siz[node]=siz[ls[node]]+siz[rs[node]]+1;}void spilt_val(int node,int vals,int &x,int &y){if(!node){x=y=0;return;}if(val[node]<=vals){x=node;spilt_val(rs[node],vals,rs[node],y);}else{y=node;spilt_val(ls[node],vals,x,ls[node]);}updata(node);}int mer(int x,int y){if(!x||!y) return x+y;if(key[x]>key[y]){rs[x]=mer(rs[x],y);updata(x);return x;}else {ls[y]=mer(x,ls[y]);updata(y);return y;}}void mer_node(int tree,int nd){int x,y;spilt_val(root[tree],val[nd],x,y);root[tree]=mer(mer(x,nd),y);}int x;void dfs(int node){if(!node) return ;dfs(ls[node]);dfs(rs[node]);ls[node]=rs[node]=0;  //!!摘掉以后记得清空siz[node]=1;mer_node(x,node);}
//    void lrd(int node){//        if(!node) return;
//        //cout<<"dfs "<<node<<endl;
//        lrd(ls[node]);
//        lrd(rs[node]);
//    }int merge_tree(int a,int b){if(siz[root[a]]<siz[root[b]]) swap(a,b);  //启发式,把b合并到a上x=a;dfs(root[b]);return x;}int get_num(int tree,int rk){int node=root[tree];if(siz[node]<rk) return -1;while(node){if(siz[ls[node]]+1==rk) break;else if(siz[ls[node]]>=rk) node=ls[node];else{rk-=siz[ls[node]]+1;node=rs[node];}}return node;}
}fhq;signed main(){ios::sync_with_stdio(false);cin.tie(0);for(int i=1;i<=100000;i++){f[i]=i;}int n,m;cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];fhq.root[i]=fhq.newnode(a[i]);}for(int i=1;i<=m;i++){int x,y;cin>>x>>y;int dx=ifind(x);int dy=ifind(y);if(dx!=dy){int now=fhq.merge_tree(dx,dy);f[dx]=now;f[dy]=now;}}int q;cin>>q;while(q--){char opt;cin>>opt;if(opt=='Q'){int x,k;cin>>x>>k;x=ifind(x);cout<<fhq.get_num(x,k)<<endl;}else{int x,y;cin>>x>>y;int dx=ifind(x);int dy=ifind(y);if(dx!=dy){int now=fhq.merge_tree(dx,dy);f[dx]=now;f[dy]=now;}}}}

P3224 [HNOI2012]永无乡 FHQ-Treap 启发式合并相关推荐

  1. P3224 [HNOI2012]永无乡(并查集+权值线段树合并/平衡树)

    [HNOI2012]永无乡 Code1 权值线段树天然支持merge,线段树上二分求第k小 #include<bits/stdc++.h>using namespace std; usin ...

  2. 【BZOJ2733】【HNOI2012】永无乡(Splay启发式合并)

    Description click me Solution 每次合并时考虑将较小的Splay中的节点依次插入较大的Splay中,发现每个点最多会被插入 log2n l o g 2 n log_2n次, ...

  3. Luogu P3224 [HNOI2012]永无乡

    题目大意 给出若干个点集,每个点带点权.你需要完成 qqq 个操作. 合并点 uuu,vvv 所在的点集. 输出点 uuu 所在的点集中点权第 kkk 大的点的编号. 数据范围 1⩽n⩽100000, ...

  4. P3224-[HNOI2012]永无乡【平衡树,启发式合并】

    正题 题目链接:https://www.luogu.com.cn/problem/P3224 题目大意 nnn个点,每次可以连接两个点和询问一个点所在联通块中第kkk大的数. 解题思路 我们发现可以启 ...

  5. 【codevs1477】【BZOJ2733】永无乡,Splay+启发式合并

    传送门1 传送门2 写在前面:被旁边的小恐龙嘲讽半天指针,最后一遍A让他目瞪口呆 思路:原本这个splay模板是用来打别的题的,但打完才发现那道题根本和splay没关系--这道题就是求一个k小值和合并 ...

  6. BZOJ 2733 | 洛谷 P3224 [HNOI2012]永无乡

    https://www.lydsy.com/JudgeOnline/problem.php?id=2733 https://www.luogu.org/problemnew/show/P3224 C+ ...

  7. BZOJ 2733: [HNOI2012]永无乡 启发式合并treap

    2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  8. BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]

    2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...

  9. bzoj 2733: [HNOI2012]永无乡(线段树启发式合并)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3850  Solved: 2061 [Submit][Sta ...

最新文章

  1. 安装TensorRT,然后导入uff库包的时候报错:ImportError: ERROR: Failed to import module(cannot import name ‘GraphDef`)
  2. 不是同一个工程的exe与dll,如何调试dll
  3. java timestamp时间差_关于datetime:如何在java中找到2个时间戳之间的日差
  4. MFC+GDI+绘制出雷达余晖效果
  5. 关于centos 7 中service iptables save 指令使用失败的结局方案
  6. markdown与latex:向量形式给字母加粗 \pmb{}
  7. Carthage 安装与使用
  8. QT之布局管理器和QLayout
  9. 抖音上热门的方法和技巧
  10. JavaScript之减速运动的实现
  11. 图像测量技术:面积测量
  12. 基于Android studio有声听书系统 java音乐播放器系统
  13. 微信订阅号推广只要这一个标题就够了!
  14. macbook视频格式转换_为了找到MacBook这个视频转换软件我哭了!太强大了!
  15. 《CPT COLORFUL PROMPT TUNING FOR PRE-TRAINED》 论文笔记
  16. keras提取网络中间层输出、中间层特征
  17. 收单外包机构为何会被强制取消备案
  18. 开博尔智能android播放器C3,开博尔C3第9代不能进桌面的刷机方法
  19. 计算机中正数和负数相加,负数减正数公式 正数与负数相加公式
  20. 熟练使用Linux系统vim程序编辑器练习案例

热门文章

  1. HTML5三屏合一的架构设计
  2. 内行人看鸿蒙系统,如何看待华为终端2020年全线搭载鸿蒙系统?内行人“一语道破”...
  3. 中文语音合成开源模型总结
  4. Python Crypto.Cipher加密包
  5. 基于Gstreamer和大疆OSDK4.0视频h264接口推流
  6. python123app_Python实现iOS APP 自动化打包
  7. vtk医学图形提取骨骼模型的算法思路
  8. Tetragon: Cilium 开源基于 eBPF 的安全可观测性 运行时增强平台
  9. 预防死锁,检测死锁,避免死锁,解除死锁....
  10. Elasticsearch是什么?