2733: [HNOI2012]永无乡

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 3778  Solved: 2020

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
 

分析

可以用并查集维护连通性,这个没啥好说的。

然后 Splay 启发式合并,合并时,直接将小的暴力加入另一个。

这个调试了好久qwq。洛谷上还t了最后一个点

code

 #include<cstdio>
#include<algorithm> using namespace std; const int MAXN = ;
int fa[MAXN],pa[MAXN],val[MAXN],ch[MAXN][],siz[MAXN],q[MAXN];
int n,m;
char opt[]; int read()
{
int x = , f = ;char ch = getchar();
while (ch<''||ch>'') {if(ch=='-')f=-; ch=getchar(); }
while (ch>=''&&ch<='') {x=x*+ch-''; ch=getchar(); }
return x*f;
}
void pushup(int x)
{
if (!x) return ;
siz[x] = siz[ch[x][]]+siz[ch[x][]]+;
}
int son(int x)
{
return ch[fa[x]][]==x;//不是等于1,qwq
}
void rotate(int x)
{
int y = fa[x],z = fa[y],b = son(x),c = son(y),a = ch[x][!b];
if (z) ch[z][c] = x;fa[x] = z;
if (a) fa[a] = y;ch[y][b] = a;
ch[x][!b] = y;fa[y] = x;
pushup(y); }
void splay(int x,int rt)
{
while (fa[x]!=rt)
{
int y = fa[x],z = fa[y];
if (z==rt) rotate(x);
else
{
if (son(x)==son(y)) rotate(y),rotate(x);
else rotate(x), rotate(x);
}
}
pushup(x);
}
void insert(int &x,int pre,int id)
{
if (!x)
{
x = id;fa[x] = pre;siz[x] = ;
splay(x,);
return ;
}
if (val[id]<=val[x]) insert(ch[x][],x,id);
else insert(ch[x][],x,id);
pushup(x);
}
int getkth(int x,int k)
{
if (k< || k>siz[x]) return -;
while (k<=siz[ch[x][]] || k>siz[ch[x][]]+)//x是变的,不能直接l = ch[x][0],用l代替chp[x][0]使用
if (k<=siz[ch[x][]]) x = ch[x][];
else k -= siz[ch[x][]]+, x = ch[x][];;
splay(x,);
return x;
}
void merge(int x,int y)
{
splay(x,);splay(y,);
if (siz[x]>siz[y]) swap(x,y);//启发式合并
int head = , tail = ;
q[] = y,q[] = x;
while (head<tail)
{
int t = q[++head];
if (ch[t][]) q[++tail] = ch[t][];
if (ch[t][]) q[++tail] = ch[t][];
ch[t][] = ch[t][] = ;
insert(q[head-],,t);
}
}
int find(int x)
{
return pa[x]==x?x:pa[x]=find(pa[x]);
}
int main()
{
n = read(),m = read();
for (int i=; i<=n; ++i)
{
val[i] = read();
pa[i] = i;siz[i] = ;
}
for (int x,y,i=; i<=m; ++i)
{
x = read();y = read();
if (find(x)!=find(y))
{
merge(x,y);
pa[find(x)] = find(y);//设为find(y),不是y
}
}
int t = read();
while (t--)
{
scanf("%s",opt);
int x = read(), y = read();
if (opt[]=='Q')
{
splay(x,);
printf("%d\n",getkth(x,y));
}
else
{
if (find(x)!=find(y))
{
merge(x,y);
pa[find(x)] = find(y);
}
}
}
return ;
}

bzoj2733: [HNOI2012]永无乡(splay)的更多相关文章

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

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

  2. 【BZOJ-2733】永无乡 Splay+启发式合并

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

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

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

  4. bzoj2733: [HNOI2012]永无乡 启发式合并

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 题目: 2733: [HNOI2012]永无乡 Time Limit: 10 Sec   ...

  5. [Bzoj2733][Hnoi2012] 永无乡(BST)(Pb_ds tree)

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

  6. [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并

    永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...

  7. BZOJ2733 [HNOI2012]永无乡 【线段树合并】

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并

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

  9. bzoj2733: [HNOI2012]永无乡 线段树合并

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

随机推荐

  1. Django之model基础(增删改查)

    一.ORM 映射关系 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象二.创建表(建立模型) 在创建表之前的准备 ...

  2. CF1174D Ehab and the Expected XOR Problem

    思路: 使用前缀和技巧进行问题转化:原数组的任意子串的异或值不能等于0或x,可以转化成前缀异或数组的任意两个元素的异或值不能等于0或x. 实现: #include <bits/stdc++.h& ...

  3. jquery 的extend的方法

    用flot.js  用到了jquery的extend 方法 关于extend方法 我就照手册打一遍,加深一下理解,说实话其实我理解的也不透 extend  用一个或多个其他对象来扩展一个对象,返回被扩 ...

  4. Angular CLI的简单使用(2)

    刚才创建了myApp这个项目,看一下这个项目的文件结构.    项目文件概览 Angular CLI项目是做快速试验和开发企业解决方案的基础. 你首先要看的文件是README.md. 它提供了一些如何 ...

  5. freebsd为网卡设置别名

    ifconfig em0 172.16.21.5 netmask 255.255.255.0 alias

  6. Tomcat Stack-8.0.35 (OpenLogic CentOS7.2)

       平台: CentOS 类型: 虚拟机镜像 软件包: apache2.4.20 mysql5.6.30 tomcat8.0.35 apache application server basic s ...

  7. php:生成的时间与本地电脑的时间不匹配

    如题,在php中我发现在数据库中的时间跟电脑上的时间没有同步 本地时间: 数据库中,生成的时间: 很明显,时分秒是对应不上去的,那么我们只要在php.ini中找到 这里被注释掉了,那我们就改成这样: ...

  8. java Vamei快速教程12 类型转换和多态

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们之前使用类创造新的类型(type),并使用继承来便利我们创建类的过程.我将在这 ...

  9. MRCA|Wright–Fisher population genetic model|SNP rate

    (Panda has a high heterozygosity rate) 通过对mtDNA(为了预测SNP的密度)的分析,可知panda的多样性,当前全基因组数据才能完全建立模型. mitocho ...

  10. JoinQuant策略代码示例

    总体回测前 ''' ================================================================================ 总体回测前 === ...