https://vjudge.net/problem/HYSBZ-2733

给一些带权点,有些点是互相连通的,

然后给出2种操作,在两点间加一条边,或者询问一个点所在的连通块内的第k小值的编号

并查集辅助+splay的启发式合并就行

由于结构简单,动态开点线段树合并也可以做

我写的是splay,由于一个奇怪的bug,我一气之下把之前的核心代码里的我自己写的splay和rotate代码全换成板子了

#include <bits/stdc++.h>
#define endl '\n'
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
using namespace std;
const int maxn=1e6+10,maxm=2e6+10;
const int INF=0x3f3f3f3f;
int casn,n,m,k;
vector<int> pre;
int find(int now) {return pre[now]==now?now:pre[now]=find(pre[now]);}
vector<int> val;
class splaytree{public:
#define nd node[now]
#define ndl node[node[now].son[0]]
#define ndr node[node[now].son[1]]struct splaynode{int son[2],fa,val,size;splaynode(){size=1,fa=son[0]=son[1]=0;}};int cnt,root;vector<splaynode> node;inline void pushup(int now){nd.size=ndl.size+ndr.size+1;}inline void pushdown(int now){}inline int wh(int now){return node[nd.fa].son[1]==now;}void rotate(int now){int fa=nd.fa,gf=node[fa].fa,c=wh(now);pushdown(fa);pushdown(now);if(gf) node[gf].son[wh(fa)]=now;nd.fa=gf;node[fa].son[c]=nd.son[c^1];node[node[fa].son[c]].fa=fa;nd.son[c^1]=fa;node[fa].fa=now;pushup(fa);pushup(now);}void splay(int now,int dst=0){for(;nd.fa!=dst;rotate(now))if(node[nd.fa].fa!=dst)rotate(wh(now)==wh(nd.fa)?nd.fa:now);if(!dst) root=now;}void insert(int pos){int now=root,fa=0,val=node[pos].val;while(now) fa=now,now=val<nd.val?nd.son[0]:nd.son[1];now=pos;node[fa].son[val>node[fa].val]=now;nd.fa=fa;splay(now);}void order(int now){int l=nd.son[0],r=nd.son[1];nd.son[0]=nd.son[1]=nd.fa=0;nd.size=1;if(l) order(l);insert(now);if(r) order(r);}void merge(int a,int b){if(a==b) return ;splay(a);splay(b);if(node[a].size>node[b].size) swap(a,b);pre[a]=b;root=b;order(a);}int kth(int now,int k){splay(now);int lsize=0;while(now){int lsum=lsize+ndl.size;if(k<=lsum) now=nd.son[0];else if(k==lsum+1) return now;else lsize=lsum+1,now=nd.son[1];}return -1;}splaytree(int n){node.resize(n+7,splaynode());rep(i,1,n) node[i].val=val[i];node[0].size=0;root=0,cnt=0;}
};
int main() {IO;int a,b;cin>>n>>m;val.resize(n+2);pre.resize(n+2);rep(i,1,n) cin>>val[i],pre[i]=i;splaytree tree(n);while(m--) {cin>>a>>b;a=find(a),b=find(b);tree.merge(a,b);}cin>>m;string s;while(m--){cin>>s>>a>>b;if(s=="B") {a=find(a),b=find(b);tree.merge(a,b);}else{a=find(a);cout<<tree.kth(a,b)<<endl;}}return 0;
}

转载于:https://www.cnblogs.com/nervendnig/p/10358664.html

bzoj2733 永无乡 splay树的启发式合并相关推荐

  1. [BZOJ2733] [HNOI2012] 永无乡 (splay启发式合并)

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

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

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

  3. bzoj2733永无乡

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

  4. [bzoj2733]永无乡 [bzoj1503]郁闷的出纳员

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1321  Solved: 693 [Submit][Stat ...

  5. BZOJ[2733][HNOI2012]永无乡 Splay启发式合并

    题目链接 题目大意及线段树合并解法在这里 每合并两个点,将它俩启发式合并 启发式合并,即把小的暴力往大的那里插 说按前序遍历插复杂度会极其优越?? 第k大是平衡树基本操作 代码如下: #include ...

  6. 【BZOJ 2733】 [HNOI2012]永无乡|Splay启发式合并

    代码能力太弱 #include <cstdio> #include <iostream> #include <algorithm> using namespace ...

  7. bzoj2733 永无乡

    传送门 维护多颗平衡树,每次把小的往大的丢,暴力合并. 用111到nnn这nnn个节点表示这nnn个树的nnn个虚根. 每颗树的rootrootroot就是原始对应的那个岛.root[i]root[i ...

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

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

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

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

最新文章

  1. 在隐私的博弈时代,BCH为你保驾护航
  2. angularJs的学习笔记
  3. Android 开发中常用小技巧
  4. Oracle入门(十四A)之PL/SQL 基本结构
  5. julia example_使用Julia中的Example的sign()函数
  6. 字符设备驱动基础篇0——驱动开发初体验
  7. 小说精品屋plus v2.7.0源码
  8. 考研分享:三战南大,考研的路上你从不孤独(内附500G最新考研资料分享)
  9. linux服务器i o模型,高性能服务器框架--I/O模型
  10. 学python能做什么类型的工作-学Python Web开发框架到什么程度可以找到开发的工作?...
  11. c++程序设计原理与实践 第二十四章部分答案
  12. 变量 重复声明_JS:定义变量的var、let有何操作?(360°无死角)
  13. Dockerfile自动创建镜像
  14. 安卓rom制作教程_【教程】安卓手机刷入第三方ROM通用教程
  15. 提升机器学习数学基础,这7本书一定要读-附pdf资源
  16. 火力全开,同时分解(切脸)多个视频
  17. 关于quartus ii 破解失败的问题
  18. 安装TeamViewer的监视器驱动后屏幕亮度无法调节
  19. PHP-阿里云oss使用
  20. 计算机xp怎么做备份,xp系统如何备份系统呢,详细教您如何备份

热门文章

  1. 8月的最后一天,随意漫笔
  2. Java 多线程基本概念
  3. [转]浅析GPU计算——cuda编程
  4. 论各类BI工具的“大数据”特性!
  5. 帆软报表插件开发之fine-decision中的EmbedRequestFilterProvider扩展
  6. oracle如何取当前日期年月_Oracle获取当前年、月、日的方法
  7. php 读csv跳过标题,请问怎么使用Python编辑csv文件时跳过标题
  8. php mysql 源码 安装教程_源码安装和配置apache(httpd)和 PHP 和 mysql全过程(一)...
  9. python定义模块结束语_python-模块定义、导入、优化
  10. 启动rrt什么意思_面试官:你来说一下springboot启动时的一个自动装配过程吧!...