[HNOI2012]永无乡 线段树合并
[HNOI2012]永无乡
线段树合并练手题,写这篇博客只是为了给我的这篇文章找个板子题。
并查集维护连通性,对于不在同一个连通块内的合并操作每次直接合并两颗线段树,复杂度\(O(n \log n)\)。
//written by newbiechd
#include <cstdio>
#define R register
#define I inline
using namespace std;
const int N = 100003;
int f[N], id[N], rt[N], T;
struct segtree {
int p, q, s;
}e[N << 5];
I int find(int x) {
R int r = x, y;
while (f[r] ^ r)
r = f[r];
while (x ^ r)
y = f[x], f[x] = r, x = y;
return r;
}
void insert(int &k, int l, int r, int x) {
k = ++T, ++e[k].s;
if (l == r)
return ;
R int m = (l + r) >> 1;
if (x <= m)
insert(e[k].p, l, m, x);
else
insert(e[k].q, m + 1, r, x);
}
int merge(int k, int t, int l, int r) {
if (!k)
return t;
if (!t)
return k;
e[k].s += e[t].s;
if (l == r)
return k;
R int m = (l + r) >> 1;
e[k].p = merge(e[k].p, e[t].p, l, m),
e[k].q = merge(e[k].q, e[t].q, m + 1, r);
return k;
}
int query(int k, int l, int r, int x) {
if (l == r)
return l;
R int m = (l + r) >> 1, t = e[e[k].p].s;
if (x <= t)
return query(e[k].p, l, m, x);
else
return query(e[k].q, m + 1, r, x - t);
}
int main() {
R int n, m, Q, i, x, y, z;
R char opt[2];
scanf("%d%d", &n, &m);
for (i = 1; i <= n; ++i)
f[i] = i, scanf("%d", &z), id[z] = i, insert(rt[i], 1, n, z);
for (i = 1; i <= m; ++i)
scanf("%d%d", &x, &y), x = find(x), y = find(y), f[y] = x,
rt[x] = merge(rt[x], rt[y], 1, n);
scanf("%d", &Q);
for (i = 1; i <= Q; ++i) {
scanf("%s%d%d", opt, &x, &y), x = find(x);
if (opt[0] == 'B') {
y = find(y);
if (y ^ x)
f[y] = x, merge(rt[x], rt[y], 1, n);
}
else
if (y > e[rt[x]].s)
printf("-1\n");
else
printf("%d\n", id[query(rt[x], 1, n, y)]);
}
return 0;
}
[HNOI2012]永无乡 线段树合并的更多相关文章
- bzoj 2733 : [HNOI2012]永无乡 (线段树合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并
题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...
- bzoj2733: [HNOI2012]永无乡 线段树合并
永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛. ...
- 洛谷P3224 [HNOI2012]永无乡(线段树合并+并查集)
题目描述 永无乡包含 nnn 座岛,编号从 111 到 nnn ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 nnn 座岛排名,名次用 111 到 nnn 来表示.某些岛之间由巨大的桥连接, ...
- 【bzoj2733】[HNOI2012]永无乡 线段树合并
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- 2733: [HNOI2012]永无乡 线段树合并
题目: https://www.lydsy.com/JudgeOnline/problem.php?id=2733 题解: 建n棵动态开点的权值线段树,然后边用并查集维护连通性,边合并线段树维护第k重 ...
- Bzoj 2733: [HNOI2012]永无乡(线段树+启发式合并)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己 ...
- bzoj 2733: [HNOI2012]永无乡 -- 线段树
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自 ...
- 【BZOJ2733】【HNOI2012】永无乡 - 线段树合并
题意: Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通 ...
随机推荐
- Entity Framework对同一张表配置一对多关系
在实际的项目开发中,可能会遇到同一张表同时保存自身和上级(或下级)的信息(一般是通过设置一个上级主键[ParentId]的列与主键[Id]关系) 例如:城市库,有国家.省.市...,省的ParentI ...
- ASP.NET MVC下Bundle的使用
ASP.NET MVC中Bundle是用于打包捆绑资源的(一般是css和js),它是在全局文件Global.asax.cs中注册Bundle,而注册的具体实现默认是在App_Start文件夹的Bund ...
- Matlab 之meshgrid, interp, griddata 用法和实例(转)
http://blog.sina.com.cn/s/blog_67f37e760101bu4e.html 实例结果http://wenku.baidu.com/link?url=SiGsFZIxuS1 ...
- TreeSet 比较器排序 自定义对象
package cn.itcast.day21.treeset2; import java.util.Comparator; import java.util.TreeSet; /* * TreeSe ...
- java判断字符串内容
java判断字符串是否全为数字 String str = "032";boolean isNum = str.matches("[0-9]+"); java判断 ...
- here i am(歌手BryanAdams的歌曲)
here i am(歌手BryanAdams的歌曲) 编辑 目录 1歌曲信息 2中英文歌词 1歌曲信息编辑 1. 歌手:Bryan Adams 布莱恩·亚当斯 生日:1959年11月5日 星座:天蝎座 ...
- #001 GIT创建分支
GitHub创建分支 如何在github 创建 一个分支出来,进行开发,最后在 merge 到主干上. Git 操作命令 git branch branchName //创建一个分支 git chec ...
- Hibernate核心对象
1.Configuration Configuration 类负责管理Hibernate的配置信息.它包括如下内容: Hibernate运行的底层信息:数据库的URL.用户名.密码.JDBC驱动类,数 ...
- P4053 [JSOI2007]建筑抢修
题目描述 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建 ...
- Hadoop学习之路(六)HDFS基础
HDFS前言 HDFS:Hadoop Distributed File System ,Hadoop分布式文件系统,主要用来解决海量数据的存储问题 设计思想 1.分散均匀存储 dfs.blocksiz ...