题面

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 的正整数,字母与数字以及两个数字之间用空格隔开。

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

HINT

对于 20%的数据 n≤1000,q≤1000
对于 100%的数据 n≤100000,m≤n,q≤300000

题目大意

给定一些点, 每个点有一个排名(也可以理解作权值), 有两种操作:

  • 给定\(u\), \(v\)两个点, 合并这两个点所在的集合
  • 询问\(u\)所在集合中权值第\(k\)小的点是哪个

Solution

  • 思路1: 平衡树启发式合并. 时间复杂度: \(O(n \log^2 n)\)
  • 思路2: 权值线段树合并. 时间复杂度: \(O(n \log n)\)

下面这份代码是线段树合并的.
注意空间要开的是\(n \log n + n\)

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>namespace Zeonfai
{inline int getInt(){int a = 0, sgn = 1;char c;while(! isdigit(c = getchar()))if(c == '-')sgn *= -1;while(isdigit(c))a = a * 10 + c - '0', c = getchar();return a * sgn;}inline char getChar(){char c;while(! isgraph(c = getchar()));return c;}void _print(int a){if(! a)return;_print(a / 10);putchar(a % 10 + '0');}inline void println(int a){if(a < 0)putchar('-'), a *= -1;if(! a)putchar(0);_print(a);putchar('\n');}
}const int N = (int)1e5;
int n;struct disjointSet
{int anc[N + 1];inline void initialize(){memset(anc, -1, sizeof(anc));}int access(int u){return ~ anc[u] ? anc[u] = access(anc[u]) : u;}inline void link(int u, int pre){anc[u] = pre;}
}st;struct segmentTrees
{struct node{int suc[2], sz;}nd[N * 18];int rt[N + 1], tp;inline void initialize(){tp = 0;memset(rt, -1, sizeof(rt));}inline void newNode(int u){nd[u].suc[0] = nd[u].suc[1] = -1, nd[u].sz = 0;}int _insert(int u, int L, int R, int pos){if(! (~ u))newNode(u = tp ++);++ nd[u].sz;if(L == R)return u;int mid = L + R >> 1;if(pos <= mid)nd[u].suc[0] = _insert(nd[u].suc[0], L, mid, pos);elsend[u].suc[1] = _insert(nd[u].suc[1], mid + 1, R, pos);return u;}inline void insert(int a, int w){rt[a] = _insert(rt[a], 1, n, w);}int _merge(int u, int _u){if(! (~ u))return _u;if(! (~ _u))return u;nd[u].sz += nd[_u].sz;for(int i = 0; i < 2; ++ i)nd[u].suc[i] = _merge(nd[u].suc[i], nd[_u].suc[i]);return u;}inline void merge(int u, int v){int setU = st.access(u), setV = st.access(v);if(setU == setV)return;if(nd[rt[setU]].sz < nd[rt[setV]].sz)std::swap(setU, setV);st.link(setV, setU);rt[setU] = _merge(rt[setU], rt[setV]);rt[setV] = -1;}int _query(int u, int L, int R, int k){if(L == R)return L;int mid = L + R >> 1;if(~ nd[u].suc[0]){if(nd[nd[u].suc[0]].sz >= k)return _query(nd[u].suc[0], L, mid, k);elsek -= nd[nd[u].suc[0]].sz;}return _query(nd[u].suc[1], mid + 1, R, k);}inline int query(int u, int k){int setU = st.access(u);if(nd[rt[setU]].sz < k)return 0;return _query(rt[setU], 1, n, k);}
}trees;int main()
{#ifndef ONLINE_JUDGEfreopen("XSY1659.in", "r", stdin);freopen("XSY1659.out", "w", stdout);#endifusing namespace Zeonfai;n = getInt();int m = getInt();st.initialize();trees.initialize();static int idx[N + 1];idx[0] = -1;for(int i = 1; i <= n; ++ i){int rk = getInt();idx[rk] = i;trees.insert(i, rk);}for(int i = 0; i < m; ++ i){int u = getInt(), v = getInt();trees.merge(u, v);}int q = getInt();for(int i = 0; i < q; ++ i){char opt = getChar();int a = getInt(), b = getInt();if(opt == 'B')trees.merge(a, b);else if(opt == 'Q')println(idx[trees.query(a, b)]);}
}

转载于:https://www.cnblogs.com/ZeonfaiHo/p/6885619.html

XSY1659 [HNOI2012]永无乡相关推荐

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

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

  2. 数据结构之fhq-treap——Chef and Sets,[HNOI2012]永无乡,Play with Chain,[NOI2005]维修数列(结构体版代码)

    因为非常板,所以主要是代码 Tyvj 1728 普通平衡树 Chef and Sets [HNOI2012]永无乡 Play with Chain [NOI2005]维修数列 题目很水,所以可能会出现 ...

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

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

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

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

  5. bzoj 2733: [HNOI2012]永无乡(线段树启发式合并)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3850  Solved: 2061 [Submit][Sta ...

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

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

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

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

  8. [HNOI2012]永无乡

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

  9. bzoj2733 [HNOI2012]永无乡

    http://www.elijahqi.win/2018/02/16/bzoj2733/ 题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n ...

最新文章

  1. Educational Codeforces Round 80 (Rated for Div. 2)SZU cf集训round2 C~E(dp,状压+二分,树状数组+逆向思维)
  2. 大型Java多用户商城系统设计开发的心得和困难
  3. 程序员减轻压力的十个建议
  4. NOIP2016普及组复赛第一题的AC程序加题解pascal
  5. 计算机将成为学生们的老师英语,重庆英语教师
  6. [网络安全提高班] 一〇一.网络攻防溯源普及和医疗数据安全总结
  7. PHP里的$_SERVER对象
  8. c#设计模式-建造者模式
  9. Android零基础入门第81节:Activity数据传递
  10. 量子计算机怎么编程,量子计算机编程(一)——QPU编程
  11. Linux中如何打开trn文件,如何通过trn日志文件恢复SQL Server
  12. Spring Boot 如何快速改造老项目?原来这么爽
  13. Oracle密码过期
  14. 基于Cocos2d-x学习OpenGL ES 2.0之多纹理
  15. FFT中的频谱泄露现象分析
  16. SAXReader 读文件读不出来
  17. 生物信息学软件_基因测序、生物信息分析平台工作站硬件配置探讨2020
  18. 机器视觉丨平行面光源的原理丨打光案例及尺寸图
  19. Wireshark lua插件
  20. abaqus python_abaqus python脚本入门

热门文章

  1. 山楂树下:温馨提示,您的2019法定节日已过完
  2. 2022年全球市场脱脂小麦胚芽粉总体规模、主要生产商、主要地区、产品和应用细分研究报告
  3. 复杂表格巧拆分(转)
  4. 【java】课程设计--抽卡模拟器
  5. 【二分查找详解外加递归写法】附有全部代码
  6. 如何下载网站中的blob:https:// 视频
  7. webrtc系列2——认识depot_tools
  8. 【解决方案】国标GB28181协议摄像头直播EasyGBS视频平台联合城管执法局搭建4G移动视频监控系统方案
  9. 2019-01-07 16:35:40 18616 [Warning] Slave SQL: Could not execute Query event. Detailed error: ;, Err
  10. 利用远程外网服务器搭建代理服务器