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. ElasticSearch:华为云搜索CSS 之POC操作记录

    2019/03/06 09:00 ES文档官方:https://support.huaweicloud.com/usermanual-es/es_01_0024.html 华为云区域:华北北京1 ES ...

  2. MongoDB 3.2 在CentOS 上的安装和配置

    MongoDB 3.2 在CentOS 上的安装和配置   2016-01-06 14:41:41 发布 您的评价:       0.0   收藏     0收藏 一.安装 编辑/etc/yum.re ...

  3. window mysql5.7 zip 安装

    第一步 ? 1 2 3 4 5 6 7 8 9 10 11 12 my-default.ini 添加配置: #绑定IPv4和3306端 bind-address = 127.0.0.1 port = ...

  4. win10+asp+access 父路径开启无效

    如题: 在win10环境下,布署asp+access,发现在用到"../website/"时就出错,提示不能使用父路径 可是我在IIS 的asp中明明打开了父路径的 如下 但是偏偏 ...

  5. Android-->RxJava2更新体验

    截止日前最新版2017-3-15: RxJava compile ‘io.reactivex:rxjava:’ compile ‘io.reactivex:rxandroid:’ RxJava2 co ...

  6. WIn10 电脑运行Docker

    参考地址: https://www.cnblogs.com/linjj/p/5606687.html https://docs.docker.com/engine/reference/commandl ...

  7. meterpreter > sysinfo

    meterpreter > sysinfoComputer : test-VCS86VROS : Windows XP (Build 2600).Architecture : x86System ...

  8. A011 Activiti工作流程开发的一些统一规则和实现原理(完整版)

    注意:以下规则是我为了规范流程的处理过程,不是Activiti公司的官方规定. 1.流程启动需要设置启动者,在Demo程序中,“启动者变量”名统一设置为initUserId 启动时要做的: ident ...

  9. POJ 2718 Smallest Difference(dfs,剪枝)

    枚举两个排列以及有那些数字,用dfs比较灵活. dfs1是枚举长度短小的那个数字,dfs2会枚举到比较大的数字,然后我们希望低位数字的差尽量大, 后面最优全是0,如果全是0都没有当前ans小的话就剪掉 ...

  10. Linux学习记录(二)

    1.远程连接工具的使用 实际开发中,Linux服务器都在其他的地方,我们要通过远程的方式去连接Linux并操作它,Linux远程的操作工具有很多,企业中常用的有Puttty.secureCRT.SSH ...