Description

永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示。某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛。如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的。现在有两种操作:B x y 表示在岛 x 与岛 y 之间修建一座新桥。Q x k 表示询问当前与岛 x连通的所有岛中第 k 重要的是哪座岛,即所有与岛 x 连通的岛中重要度排名第 k 小的岛是哪 座,请你输出那个岛的编号。

Input

输入文件第一行是用空格隔开的两个正整数
n 和 m,分别 表示岛的个数以及一开始存在的桥数。接下来的一行是用空格隔开的 n 个数,依次描述从岛 1 到岛 n 的重要度排名。随后的 m
行每行是用空格隔开的两个正整数 ai 和 bi,表示一开始就存 在一座连接岛 ai 和岛 bi
的桥。后面剩下的部分描述操作,该部分的第一行是一个正整数 q, 表示一共有 q 个操作,接下来的 q
行依次描述每个操作,操作的格式如上所述,以大写字母 Q 或B 开始,后面跟两个不超过 n 的正整数,字母与数字以及两个数字之间用空格隔开。 对于
20%的数据 n≤1000,q≤1000
 
对于 100%的数据 n≤100000,m≤n,q≤300000

Output

对于每个 Q x k 操作都要依次输出一行,其中包含一个整数,表 示所询问岛屿的编号。如果该岛屿不存在,则输出-1。

Sample Input

5 1
4 3 2 5 1
1 2
7
Q 3 2
Q 2 1
B 2 3
B 1 5
Q 2 1
Q 2 4
Q 2 3

Sample Output

-1
2
5
1
2

tmd手残把rotate写错了……
中间将一个splay的点插入到另一个splay中忘了把插入的点clear……
什么鬼啊一个启发式合并的模板题为什么让我做成这样……
累觉不爱

 #include<iostream>
#include<cstring>
#include<cstdio>
#define N (100000+100)
using namespace std;
int n,m,p;
int Root[N],num[N];
int Val[N],Size[N],Father[N],Son[N][]; int Get(int x) {return Son[Father[x]][]==x;}
void Update(int x) {Size[x]=Size[Son[x][]]+Size[Son[x][]]+;}
void Clear(int x) {num[x]=Size[x]=Father[x]=Son[x][]=Son[x][]=;}
void Rotate(int x)
{
int wh=Get(x);
int fa=Father[x],fafa=Father[fa];
if (fafa) Son[fafa][Son[fafa][]==fa]=x;
Father[fa]=x; Son[fa][wh]=Son[x][wh^];
if (Son[fa][wh]) Father[Son[fa][wh]]=fa;
Father[x]=fafa; Son[x][wh^]=fa;
Update(fa); Update(x);
} void Splay(int x)
{
for (int fa;fa=Father[x];Rotate(x))
if (Father[fa])
Rotate(Get(x)==Get(fa)?fa:x);
Root[num[x]]=x;
} void Insert(int x,int y)//insert x to y
{
int now=Root[num[y]],fa=;
while ()
{
fa=now,now=Son[now][Val[x]>Val[now]];
if (now==)
{
Father[x]=fa;
Son[fa][Val[x]>Val[fa]]=x;
Size[x]=;
num[x]=num[y];
Update(fa);
Splay(x);
return;
}
}
} void Dfs(int x,int y)
{
if (Son[x][]) Dfs(Son[x][],y);
if (Son[x][]) Dfs(Son[x][],y);
Clear(x);
Insert(x,y);
} void Merge(int x,int y)
{
if (Size[x]>Size[y]) swap(x,y);
Dfs(x,y);
} int Findx(int now,int x)
{
while ()
if (x<=Size[Son[now][]])
now=Son[now][];
else
{
x-=Size[Son[now][]];
if (x==)
{
Splay(now);
return now;
}
x--;
now=Son[now][];
}
} int main()
{
char opt[];
int x,y;
scanf("%d%d",&n,&m);
for (int i=;i<=n;++i)
{
scanf("%d",&Val[i]);
Root[i]=num[i]=i;
Size[i]=;
}
//num表示每个点属于的树的标号,Root表示对于标号树的根
for (int i=;i<=m;++i)
{
scanf("%d%d",&x,&y);
if (num[x]!=num[y])
Merge(Root[num[x]],Root[num[y]]);
}
scanf("%d",&p);
for (int i=;i<=p;++i)
{
scanf("%s%d%d",opt,&x,&y);
if (opt[]=='Q') printf("%d\n",Size[Root[num[x]]]>=y?Findx(Root[num[x]],y):-);
if (opt[]=='B' && num[x]!=num[y]) Merge(Root[num[x]],Root[num[y]]);
}
}

2733. [HNOI2012]永无乡【平衡树-splay】的更多相关文章

  1. Bzoj 2733: [HNOI2012]永无乡 数组Splay+启发式合并

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3955  Solved: 2112[Submit][Statu ...

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

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

  3. Bzoj 2733: [HNOI2012]永无乡(线段树+启发式合并)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己 ...

  4. bzoj2733: [HNOI2012]永无乡(splay)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3778  Solved: 2020 Description 永 ...

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

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

  6. bzoj 2733: [HNOI2012]永无乡 离线+主席树

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1167  Solved: 607[Submit][Status ...

  7. BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)

    不难...treap + 启发式合并 + 并查集 搞搞就行了 --------------------------------------------------------------------- ...

  8. bzoj 2733: [HNOI2012]永无乡 -- 线段树

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自 ...

  9. 线段树合并+并查集 || BZOJ 2733: [HNOI2012]永无乡 || Luogu P3224 [HNOI2012]永无乡

    题面:P3224 [HNOI2012]永无乡 题解: 随便写写 代码: #include<cstdio> #include<cstring> #include<iostr ...

随机推荐

  1. MySQL免安装版下载与配置

    1.     下载Mysql 官方:http://www.mysql.com→downloads→选社区版本MySQL Community Edition(GPL)→点击Community(GPL)D ...

  2. JSP学习笔记(4)-Javabean

    按照sun公司的定义,Javabean是一个可重复使用的软件组件,实际上Javabean是一种Java类,通过封装属性和方法成为具有某种功能或处理某个业务的对象,简称Bean,Javabean基于ja ...

  3. Linux排查Java程序占用CPU很高的解决办法

    Java的工具集相当强大,学习成本也很低,处理线上问题时,jstack这个工具就比微软的windbg,好学好用很多,3步找出占用CPU很高的源所在.而windbg反人类的各种命令,实在不敢恭维. 故意 ...

  4. IT小鲜肉 widgets tree 三种格式数据源

    昨天完成了下面几个功能,其中最麻烦的就是做图.边学GIMP用法边做图 1.使用GIMP软件G了几个图标 2.支持一维数组数据源,并按照指定的属性对数据源中的数据进行自动分组 运行效果: 3.支持由pi ...

  5. JavsScript--on与addEventListener的使用与两者的不同

    Js之on和addEventListener的使用与不同 一.首先介绍两者的用法: 1.on的用法:以onclick为例 第一种: obj.onclick = function(){ //do som ...

  6. GitHub已将持续集成服务器Janky开源

    GitHub已将Janky开源,这是他们构建在Jenkins之上的持续集成服务器,并在其中增加了聊天自动化工具Hubot. 除了一般的Jenkins功能之外,Janky还通过Hubot对功能进行了补充 ...

  7. the detailed annotation of StringBuilder

    public int capacity() 返回当前容量.容量指可用于最新插入字符的存储量,超过这一容量便需要再次分配. 返回: 当前容量. public int length() 返回长度(字符数) ...

  8. Python 操作数据库pymysql

    import pymysql #添加数据 conn , user='root', passwd='', db='yyy') #更改获取数据结果的数据类型,默认是元组,可以改为字典等:#cursor=c ...

  9. Axure中移动端原型设计方法(附IPhoneX和IPhone8最新模板)

    Axure中移动端原型设计方法(附IPhoneX和IPhone8最新模板) 2018年4月16日luodonggan Axure中基于设备模板的移动端原型设计方法(附IPhoneX和IPhone8最新 ...

  10. springMVC入门-08

    这一讲介绍用户登录实现以及两种异常处理controller控制器的方法,最后提一下在springMVC中对静态资源访问的实现方法. 用户登录需要一个登录页面login.jsp,对应代码如下所示: &l ...