题目链接

  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)相关推荐

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

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

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

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

  3. bzoj2733 永无乡 splay树的启发式合并

    https://vjudge.net/problem/HYSBZ-2733 给一些带权点,有些点是互相连通的, 然后给出2种操作,在两点间加一条边,或者询问一个点所在的连通块内的第k小值的编号 并查集 ...

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

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

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

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

  6. 洛谷P3224【HNOI2012】永无乡

    洛谷P3224[HNOI2012]永无乡 题目大意 有 n n n个点,每个点都有一个重要度.先连接 m m m条边,然后有 q q q次操作: B x y 表示连接点 x x x和点 y y y Q ...

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

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

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

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

  9. HNOI 2012 永无乡

    codevs 1477 永无乡 http://codevs.cn/problem/1477/ 2012年湖南湖北省队选拔赛  时间限制: 1 s  空间限制: 128000 KB 题目描述 Descr ...

最新文章

  1. List Control Utility
  2. python少儿编程 在线课程-宁波Python程序开发课程
  3. PHP Extension Makefile 製作
  4. 【CV夏季划】2021年冲刺CV秋招,100余课时从理论基础到进阶实践系统掌握
  5. 家用笔记本电脑什么牌子好_南阳家用小型电梯什么牌子好
  6. dhl:使用return RedirectToAction()和 return view()
  7. CPUID详解[增加TLB与Cache]
  8. case when 多条件_3年前的设计如今被iPhone强推 PITAKA磁吸生态设计的前瞻性到底有多可怕?...
  9. MySQL笔记-InnoDB物理及逻辑存储结构
  10. python flask和django_真正搞明白Python中Django和Flask框架的区别
  11. 云时代,运维要么自己写代码,要么开发替你写了
  12. SVN如何迁移到Git?
  13. jupyter lab 导出笔记为pdf
  14. 发那科机器人注油_东莞发那科工业机器人维保中心
  15. 数电设计--交通灯控制系统
  16. RAC 11.2.0.3 LISTENER异常终止
  17. 解决win10 phptoshop #fff纯白不是这样的白 显示器高级的问题
  18. xingtai -飞机大战2。0
  19. 这4款数据自动化探索 Python 神器,解决99%的数据分析问题!
  20. 计算机浏览器应用程序,电脑打开IE浏览器显示找不到应用程序如何解决

热门文章

  1. Linux系统基本命令之vim编辑器的使用
  2. switch中default的用法
  3. 计算机辅助设计课程描述,计算机辅助设计课程教学的现状与方法
  4. mysql存json将utf8编码 去掉,MySQL对JSON类型UTF-8编码导致中文乱码探讨
  5. iview日期选择器更改显示日期书_如何动态 设置 iview DatePicker 控件的 禁用日期(option)...
  6. mysql自增变量插入行时需要赋值
  7. 008_多配置文件的引入
  8. WebDriverAgent安装到iphone真机
  9. 记住linux terminal下的快捷键,提高操作效率!
  10. oracle 导数据报exp00058_一文看懂oracle12c数据库跨小版本迁移