【Luogu】P3224永无乡(splay)
splay模板,启发式合并(其实就是暴力插入)即可。
顺便吐槽时限,带垃圾回收而已……不至于最后一个点死活不让过吧?
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cctype>
#include<queue>
#define maxn 100020
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int CNT;
struct Node{
int val,size,e[],fa,num;
}tree[maxn*];
int tot; struct Splay{
int root;
Splay(){root=;}
inline void update(int x){tree[x].size=tree[tree[x].e[]].size+tree[tree[x].e[]].size+; }
inline int iden(int x){ return x==tree[tree[x].fa].e[]; }
inline void connect(int x,int fa,int how){ tree[x].fa=fa; tree[fa].e[how]=x; }
void rotate(int x){
int y=tree[x].fa; int r=tree[y].fa;
int sony=iden(x); int sonr=iden(y);
if(root==y) root=x;
int b=tree[x].e[sony^];
connect(b,y,sony);
connect(y,x,sony^);
connect(x,r,sonr);
update(y); update(x);
}
void splay(int pos,int to){
to=tree[to].fa;
while(tree[pos].fa!=to){
if(tree[tree[pos].fa].fa==to) rotate(pos);
else
if(iden(pos)==iden(tree[pos].fa)){
rotate(tree[pos].fa);
rotate(pos);
}
else{ rotate(pos); rotate(pos); }
}
}
inline int create(int val,int num,int fa){
tree[++tot]=(Node){val,,{,},fa,num};
return tot;
}
int build(int val,int num){
if(root==){
root=create(val,num,);
return root;
}
int now=root;
while(now){
tree[now].size++;
int nxt=val<tree[now].val?:;
if(tree[now].e[nxt]==){
connect(create(val,num,now),now,nxt);
update(now);
return tot;
}
now=tree[now].e[nxt];
}
}
void insert(int val,int num){
int p=build(val,num);
if(++CNT==){
splay(p,root);
CNT=;
}
}
int rank(int val){
if(tree[root].size<val) return -;
int now=root;
while(){
if(tree[tree[now].e[]].size+==val) return tree[now].num;
if(tree[tree[now].e[]].size>=val) now=tree[now].e[];
else{
val-=tree[tree[now].e[]].size+;
now=tree[now].e[];
}
}
}
}s[maxn]; void pushtree(int now,int x){
s[x].insert(tree[now].val,tree[now].num);
if(tree[now].e[]) pushtree(tree[now].e[],x);
if(tree[now].e[]) pushtree(tree[now].e[],x);
} int father[maxn];
int w[maxn]; int ufind(int x){
if(father[x]!=x) father[x]=ufind(father[x]);
return father[x];
} void unionn(int x,int y){
x=ufind(x); y=ufind(y);
if(tree[s[x].root].size<tree[s[y].root].size) swap(x,y);
pushtree(s[y].root,x);
father[y]=x;
} int main(){
int n=read(),m=read();
for(int i=;i<=n;++i){
w[i]=read();
father[i]=i;
s[i].insert(w[i],i);
}
for(int i=;i<=m;++i){
int x=read(),y=read();
unionn(x,y);
}
int p=read();
for(int i=;i<=p;++i){
char c[];
scanf("%s",c);
int x=read(),y=read();
if(c[]=='Q') printf("%d\n",s[ufind(x)].rank(y));
else unionn(x,y);
}
return ;
}
【Luogu】P3224永无乡(splay)的更多相关文章
- 【BZOJ-2733】永无乡   Splay+启发式合并
		
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2048 Solved: 1078[Submit][Statu ...
 - BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]
		
2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...
 - [BZOJ2733] [HNOI2012] 永无乡 (splay启发式合并)
		
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
 - 洛谷P3224 永无乡 [HNOI2012] 线段树/splay/treap
		
正解:线段树合并 解题报告: 传送门! 这题也是有很多解法,eg:splay,treap,... 然而我都不会我会学的QAQ! 反正今天就只讲下线段树合并怎么做QAQ 首先看到这样子的说第k重要的是什 ...
 - 【BZOJ 2733】【HNOI 2012】永无乡   Splay启发式合并
		
启发式合并而已啦,, 调试时发现的错误点:insert后没有splay,把要拆开的树的点插入另一个树时没有把ch[2]和fa设为null,找第k大时没有先减k,,, 都是常犯的错误,比赛时再这么粗心就 ...
 - bzoj2733 永无乡 splay树的启发式合并
		
https://vjudge.net/problem/HYSBZ-2733 给一些带权点,有些点是互相连通的, 然后给出2种操作,在两点间加一条边,或者询问一个点所在的连通块内的第k小值的编号 并查集 ...
 - 洛谷.3224.[HNOI2012]永无乡(Splay启发式合并)
		
题目链接 查找排名为k的数用平衡树 合并时用启发式合并,把size小的树上的所有节点插入到size大的树中,每个节点最多需要O(logn)时间 并查集维护连通关系即可 O(nlogn*insert t ...
 - 【洛谷3224/BZOJ2733】[HNOI2012]永无乡 (Splay启发式合并)
		
题目: 洛谷3224 分析: 这题一看\(n\leq100000\)的范围就知道可以暴力地用\(O(nlogn)\)数据结构乱搞啊-- 每个联通块建一棵Splay树,查询就是Splay查询第k大的模板 ...
 - 洛谷 [P3224] 永无乡
		
Treap 的合并 首先感谢 @Capella 的DeBug 其次,这是由一个 & 号引发的血案 注意对于所有修改操作都要 & Treap的合并, 启发式合并,对于每一个节点都 ins ...
 
随机推荐
- cv2.solvepnp 相机的位姿估计
			
预备知识 图像坐标系: 理想的图像坐标系原点O1和真实的O0有一定的偏差,由此我们建立了等式(1)和(2),可以用矩阵形式(3)表示. 相机坐标系(C)和世界坐标系(W): 通过相机与图像的投 ...
 - 2_分布式计算框架MapReduce
			
一.mr介绍 1.MapReduce设计理念是移动计算而不是移动数据,就是把分析计算的程序,分别拷贝一份到不同的机器上,而不是移动数据. 2.计算框架有很多,不是谁替换谁的问题,是谁更适合的问题.mr ...
 - mac 升级EI Capitan后遇到c++转lua时遇到libclang.dylib找不到的错
			
升级EI Capitan后,打包lua脚本时,会报这个错: LibclangError: dlopen(libclang.dylib, 6): image not found. To provide ...
 - 重温经典之赫夫曼(Huffman)编码
			
先看看赫夫曼树假设有n个权值{w1,w2,…,wn},构造一个有n个叶子结点的二叉树,每个叶子结点权值为wi,则其中带权路径长度WPL最小的二叉树称作赫夫曼树或最优二叉树. 赫夫曼树的构造,赫夫曼最早 ...
 - NOIP模拟赛 数列
			
Problem 2 数列(seq.cpp/c/pas) [题目描述] a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1] (x>3) 求a数列的第n项对1000000007 ...
 - python爬虫用到的一些东西
			
原装requests >>> import requests >>> response = requests.get('http://www.baidu.com') ...
 - CSS基础(一)
			
一.CSS概述 CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解决内容与表 ...
 - OC8051项目启动
 - windows下配置Nginx支持php
			
编辑配置文件nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; ...
 - 2018 Python开发者大调查:Python和JavaScript最配?
			
在2018年秋季,Python软件基金会与JetBrains发起了年度Python开发者调查. 报告的目的是寻找Python领域的新趋势,帮助开发者深入了解2018年Python开发者的现状. 该报告 ...