【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=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}while(isdigit(ch)){num=num*10+ch-'0';ch=getchar();}return num*f; }int CNT; struct Node{int val,size,e[2],fa,num; }tree[maxn*10]; int tot;struct Splay{int root;Splay(){root=0;}inline void update(int x){tree[x].size=tree[tree[x].e[0]].size+tree[tree[x].e[1]].size+1; }inline int iden(int x){ return x==tree[tree[x].fa].e[1]; }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^1];connect(b,y,sony);connect(y,x,sony^1);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);elseif(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,1,{0,0},fa,num};return tot;}int build(int val,int num){if(root==0){root=create(val,num,0);return root;}int now=root;while(now){tree[now].size++;int nxt=val<tree[now].val?0:1;if(tree[now].e[nxt]==0){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==50){splay(p,root);CNT=0;}}int rank(int val){if(tree[root].size<val) return -1;int now=root;while(1){if(tree[tree[now].e[0]].size+1==val) return tree[now].num;if(tree[tree[now].e[0]].size>=val) now=tree[now].e[0];else{val-=tree[tree[now].e[0]].size+1;now=tree[now].e[1];}}} }s[maxn];void pushtree(int now,int x){s[x].insert(tree[now].val,tree[now].num);if(tree[now].e[0]) pushtree(tree[now].e[0],x);if(tree[now].e[1]) pushtree(tree[now].e[1],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=1;i<=n;++i){w[i]=read();father[i]=i;s[i].insert(w[i],i);}for(int i=1;i<=m;++i){int x=read(),y=read();unionn(x,y);}int p=read();for(int i=1;i<=p;++i){char c[10];scanf("%s",c);int x=read(),y=read();if(c[0]=='Q') printf("%d\n",s[ufind(x)].rank(y));else unionn(x,y);}return 0; }
转载于:https://www.cnblogs.com/cellular-automaton/p/8358187.html
【Luogu】P3224永无乡(splay)相关推荐
- BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]
2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...
- [BZOJ2733] [HNOI2012] 永无乡 (splay启发式合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- bzoj2733 永无乡 splay树的启发式合并
https://vjudge.net/problem/HYSBZ-2733 给一些带权点,有些点是互相连通的, 然后给出2种操作,在两点间加一条边,或者询问一个点所在的连通块内的第k小值的编号 并查集 ...
- 【BZOJ 2733】 [HNOI2012]永无乡|Splay启发式合并
代码能力太弱 #include <cstdio> #include <iostream> #include <algorithm> using namespace ...
- BZOJ[2733][HNOI2012]永无乡 Splay启发式合并
题目链接 题目大意及线段树合并解法在这里 每合并两个点,将它俩启发式合并 启发式合并,即把小的暴力往大的那里插 说按前序遍历插复杂度会极其优越?? 第k大是平衡树基本操作 代码如下: #include ...
- 洛谷P3224【HNOI2012】永无乡
洛谷P3224[HNOI2012]永无乡 题目大意 有 n n n个点,每个点都有一个重要度.先连接 m m m条边,然后有 q q q次操作: B x y 表示连接点 x x x和点 y y y Q ...
- 【BZOJ2733】【HNOI2012】永无乡(Splay启发式合并)
Description click me Solution 每次合并时考虑将较小的Splay中的节点依次插入较大的Splay中,发现每个点最多会被插入 log2n l o g 2 n log_2n次, ...
- P3224 [HNOI2012]永无乡(并查集+权值线段树合并/平衡树)
[HNOI2012]永无乡 Code1 权值线段树天然支持merge,线段树上二分求第k小 #include<bits/stdc++.h>using namespace std; usin ...
- HNOI 2012 永无乡
codevs 1477 永无乡 http://codevs.cn/problem/1477/ 2012年湖南湖北省队选拔赛 时间限制: 1 s 空间限制: 128000 KB 题目描述 Descr ...
最新文章
- List Control Utility
- python少儿编程 在线课程-宁波Python程序开发课程
- PHP Extension Makefile 製作
- 【CV夏季划】2021年冲刺CV秋招,100余课时从理论基础到进阶实践系统掌握
- 家用笔记本电脑什么牌子好_南阳家用小型电梯什么牌子好
- dhl:使用return RedirectToAction()和 return view()
- CPUID详解[增加TLB与Cache]
- case when 多条件_3年前的设计如今被iPhone强推 PITAKA磁吸生态设计的前瞻性到底有多可怕?...
- MySQL笔记-InnoDB物理及逻辑存储结构
- python flask和django_真正搞明白Python中Django和Flask框架的区别
- 云时代,运维要么自己写代码,要么开发替你写了
- SVN如何迁移到Git?
- jupyter lab 导出笔记为pdf
- 发那科机器人注油_东莞发那科工业机器人维保中心
- 数电设计--交通灯控制系统
- RAC 11.2.0.3 LISTENER异常终止
- 解决win10 phptoshop #fff纯白不是这样的白 显示器高级的问题
- xingtai -飞机大战2。0
- 这4款数据自动化探索 Python 神器,解决99%的数据分析问题!
- 计算机浏览器应用程序,电脑打开IE浏览器显示找不到应用程序如何解决
热门文章
- Linux系统基本命令之vim编辑器的使用
- switch中default的用法
- 计算机辅助设计课程描述,计算机辅助设计课程教学的现状与方法
- mysql存json将utf8编码 去掉,MySQL对JSON类型UTF-8编码导致中文乱码探讨
- iview日期选择器更改显示日期书_如何动态 设置 iview DatePicker 控件的 禁用日期(option)...
- mysql自增变量插入行时需要赋值
- 008_多配置文件的引入
- WebDriverAgent安装到iphone真机
- 记住linux terminal下的快捷键,提高操作效率!
- oracle 导数据报exp00058_一文看懂oracle12c数据库跨小版本迁移