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

第k大+合并,一眼就是BST合并啊,裸题练treap板子。
 
当然也可以线段树合并,由于线段树具有可二分性,所以一个log就可以解决问题。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 100100
#define llg long long
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,Q;
char ch; struct TREAP
{
llg size;
struct
{
llg l,r,rnd,val,size,fa;
}po[maxn]; void update(llg x){po[x].size=po[po[x].l].size+po[po[x].r].size;} llg right_(llg x)
{
llg t=po[x].l;
po[x].l=po[t].r; po[po[t].r].fa=x;
po[t].r=x; po[x].fa=t;
po[t].size=po[x].size;
update(x);
return t;
} llg left_(llg x)
{
llg t=po[x].r;
po[x].r=po[t].l; po[po[t].l].fa=x;
po[t].l=x; po[x].fa=t;
po[t].size=po[x].size;
update(x);
return t;
} void init()
{
size=; memset(po,,sizeof(po));
for (llg i=;i<=n;i++) scanf("%lld",&po[i].val),po[i].fa=i;
} llg insert(llg x,llg wz,llg lx)
{
if (x==)
{
po[wz].size=; po[wz].fa=lx;
return wz;
}
po[x].size++;
if (po[x].val<po[wz].val)
{
po[x].r=insert(po[x].r,wz,x);
if (po[po[x].r].rnd<po[x].rnd) x=left_(x);
}
else
{
po[x].l=insert(po[x].l,wz,x);
if (po[po[x].l].rnd<po[x].rnd) x=right_(x);
}
po[x].fa=lx;
return x;
} llg find_root(llg x)
{
while (po[x].fa!=x)
x=po[x].fa;
return x;
} void dfs(llg x,llg y)
{
if (x==) return ;
dfs(po[x].l,y);
dfs(po[x].r,y);
insert(y,x,y);
} void union_(llg x,llg y)
{
llg f1=find_root(x),f2=find_root(y);
if (f1==f2) return ;
if (po[f1].size<po[f2].size) swap(f1,f2);
dfs(f2,f1);
} llg rank(llg x,llg res)
{
if (res==po[po[x].l].size+) return x;
if (res<=po[po[x].l].size) return rank(po[x].l,res);
else return rank(po[x].r,res-po[po[x].l].size-);
}
}tree; int main()
{
yyj("a");
cin>>n>>m;
tree.init();
for (llg i=;i<=m;i++)
{
llg x,y;
scanf("%lld%lld",&x,&y);
tree.union_(x,y);
}
cin>>Q;
while (Q--)
{
llg x,y;
ch=getchar();
while (ch!='Q' && ch!='B') ch=getchar();
scanf("%lld%lld",&x,&y);
if (ch=='Q')
{
llg ans=tree.rank(tree.find_root(x),y);
if (ans==) ans=-;
printf("%lld\n",ans);
}
else
{
tree.union_(x,y);
}
}
return ;
}

【bzoj】2733: [HNOI2012]永无乡的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. bzoj 2733: [HNOI2012]永无乡

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

  10. bzoj 2733 : [HNOI2012]永无乡 (线段树合并)

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

随机推荐

  1. poj2063 Investment

    http://poj.org/problem?id=2063 首先总结一下:总的来说通过这题我深深感觉到了自己的不足,比赛时思维很受限,...面对超时,没有想到好的解决方案. 题意:给出初始资金,还有 ...

  2. Amazon SES SPF和DKIM设置教程

    SPF和DKIM设置是争对域名邮箱而言的(公共邮件也不会给你修改DNS的权限),主要作用就是防止邮箱伪造提升邮件信用度 首先到亚马逊添加域名并验证 添加后,给出了域名验证的方法,就是在dns记录里添加 ...

  3. 算法---数组总结篇2——找丢失的数,找最大最小,前k大,第k小的数

    一.如何找出数组中丢失的数 题目描述:给定一个由n-1个整数组成的未排序的数组序列,其原始都是1到n中的不同的整数,请写出一个寻找数组序列中缺失整数的线性时间算法 方法1:累加求和 时间复杂度是O(N ...

  4. Android adb.exe程序启动不起来处理方法

    经常遇到 Please ensure that adb is correctly located at 'D:\java\sdk\platform-tools\adb.exe' and can be ...

  5. CRM项目总结-封装PortletURLUtil

    package com.ebizwindow.crm.utils; import java.security.Key; import java.util.List; import javax.port ...

  6. 转载的 Linux下chkconfig命令详解

    Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...

  7. Python: 合并多个字典

    现在有多个字典或者映射,想将它们从逻辑上合并为一个单一的映射后执行某些操作,比如查找值或者检查某些键是否存在. eg1: a = {'x': 1, 'z': 3 }b = {'y': 2, 'z': ...

  8. cmd中mysql中文乱码问题

    以下为自己亲试: 解决cmd中MySQL查询和命令返回的中文乱码问题 1.修改cmd字符集方法 rem 切换到UTF-8 chcp 65001 rem 切换到默认的GBK chcp 936 rem 美 ...

  9. Storm初探

    Storm是一种分布式流式处理技术,这一点和Spark与Hadoop的批处理特性有明显的区别. 在数据连续产生,响应时延要求较低的场景中,Storm具有Spark不可比拟的优势. 网络性能监控系统中, ...

  10. bzoj1689 / P1589 [Usaco2005 Open] Muddy roads 泥泞的路

    P1589 [Usaco2005 Open] Muddy roads 泥泞的路 简单的模拟题. 给水坑排个序,蓝后贪心放板子. 注意边界细节. #include<iostream> #in ...