「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】
题目链接
题解
很明显是要用线段树合并的。
对于当前的每一个连通块都建立一个权值线段树。
权值线段树处理操作中的\(k\)大的问题。
如果需要合并,那么就线段树暴力合并,时间复杂度是\(nlogn\),均摊下来就是\(logn\)。
判断联通性的问题就用并查集来解决。
如果在同一个联通块里,就不能合并,否则会出一点问题。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 3000000 + 6;
int rt[N], id[N], fa[N];
int n, m, v[N], k;
char opt[5];
namespace seg {
int ncnt = 0;
struct node {
int lc, rc, sz;
node() { lc = rc = sz = 0; }
} tr[N << 1];
void pushup(int nod) {
tr[nod].sz = tr[tr[nod].lc].sz + tr[tr[nod].rc].sz;
}
void ins(int &nod, int l, int r, int k) {
if (!nod) nod = ++ ncnt;
if (l == r) {
tr[nod].sz = 1;
return;
}
int mid = (l + r) >> 1;
if (k <= mid) ins(tr[nod].lc, l, mid, k);
else ins(tr[nod].rc, mid + 1, r, k);
pushup(nod);
}
int kth(int x, int l, int r, int rk) {
if (l == r) return l;
int mid = (l + r) >> 1;
if (tr[tr[x].lc].sz >= rk) return kth(tr[x].lc, l, mid, rk);
else return kth(tr[x].rc, mid + 1, r, rk - tr[tr[x].lc].sz);
}
int merge(int x, int y) {
if (!x) return y;
if (!y) return x;
tr[x].lc = merge(tr[x].lc, tr[y].lc);
tr[x].rc = merge(tr[x].rc, tr[y].rc);
pushup(x);
return x;
} }
int gf(int x) {
return x == fa[x] ? x : fa[x] = gf(fa[x]);
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++) {
scanf("%d", &v[i]);
fa[i] = i;
id[v[i]] = i;
}
for (int i = 1, a, b; i <= m; i ++) {
scanf("%d%d", &a, &b);
int x = gf(a), y = gf(b);
fa[x] = y;
}
for (int i = 1; i <= n; i ++) seg::ins(rt[gf(i)], 1, n, v[i]);
scanf("%d", &k);
while (k --) {
scanf("%s", opt); int x, y; scanf("%d%d", &x, &y);
if (opt[0] == 'Q') {
int z = gf(x);
if (seg::tr[rt[z]].sz < y) puts("-1");
else {
int t = seg::kth(rt[z], 1, n, y);
printf("%d\n", id[t]);
}
} else {
int a = gf(x), b = gf(y);
if (a == b) continue;
fa[a] = b;
rt[b] = seg::merge(rt[a], rt[b]);
}
}
return 0;
}
「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】的更多相关文章
- 【BZOJ2733】【HNOI2012】永无乡 - 线段树合并
题意: Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通 ...
- 洛谷P3224 [HNOI2012]永无乡(线段树合并+并查集)
题目描述 永无乡包含 nnn 座岛,编号从 111 到 nnn ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 nnn 座岛排名,名次用 111 到 nnn 来表示.某些岛之间由巨大的桥连接, ...
- BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并
题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...
- bzoj2733: [HNOI2012]永无乡 线段树合并
永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛. ...
- 【bzoj2733】[HNOI2012]永无乡 线段树合并
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- 洛谷P4770 [NOI2018]你的名字 [后缀自动机,线段树合并]
传送门 思路 按照套路,直接上后缀自动机. 部分分:\(l=1,r=|S|\) 首先把\(S\)和\(T\)的后缀自动机都建出来. 考虑枚举\(T\)中的右端点\(r\),查询以\(r\)结尾的串最长 ...
- 【洛谷3224/BZOJ2733】[HNOI2012]永无乡 (Splay启发式合并)
题目: 洛谷3224 分析: 这题一看\(n\leq100000\)的范围就知道可以暴力地用\(O(nlogn)\)数据结构乱搞啊-- 每个联通块建一棵Splay树,查询就是Splay查询第k大的模板 ...
- 洛谷.3224.[HNOI2012]永无乡(Splay启发式合并)
题目链接 查找排名为k的数用平衡树 合并时用启发式合并,把size小的树上的所有节点插入到size大的树中,每个节点最多需要O(logn)时间 并查集维护连通关系即可 O(nlogn*insert t ...
- 洛谷P4254 [JSOI2008]Blue Mary开公司(李超线段树)
题面 传送门 题解 李超线段树板子 具体可以看这里 //minamoto #include<bits/stdc++.h> #define R register #define fp(i,a ...
- 洛谷P4493 [HAOI2018]字串覆盖(后缀自动机+线段树+倍增)
题面 传送门 题解 字符串就硬是要和数据结构结合在一起么--\(loj\)上\(rk1\)好像码了\(10k\)的样子-- 我们设\(L=r-l+1\) 首先可以发现对于\(T\)串一定是从左到右,能 ...
随机推荐
- 【转载】 Sqlserver中通过Select Into语句快速单表备份
在Sqlserver数据库中,备份数据的方式有很多种,可以使用整个数据库备份,也可使用导出包含数据和架构的脚本文件的方式来进行单表或多表数据的备份,其实还有一种Select Into的方式可以快速备份 ...
- 学JAVA第十八天,接口与抽象类进一步加深
昨天老师讲了建网站,还要交钱买东西的,所以就没写,今天讲了接口与抽象类进一步加深 上完今天的课后,我才知道一个接口可以有多个实现类,一个实现类可以同时接多个接口. 现在就用代码来解释吧!!! 举例用人 ...
- SpringCloud-config分布式配置中心
为什么要统一管理微服务配置? 随着微服务不断的增多,每个微服务都有自己对应的配置文件.在研发过程中有测试环境.UAT环境.生产环境,因此每个微服务又对应至少三个不同环境的配置文件.这么多的配置文件,如 ...
- Ubuntu16.04安装RealSense SR300驱动
原文链接 https://blog.csdn.net/u013401766/article/details/78472285 第一步:CMake 3.14.0 安装 1)下载cmake-3.14.1. ...
- vue-render函数和插槽
Vue render函数,官方文档定义绝大部分时候我们使用template 来创建html 模板,但是纯html 和css都基本上都不具有编程能力,而当我们想使用 javascript的编程能力时,我 ...
- js字符串转json格式与json对象转字符串
json字符串----->json对象json对象------>json字符串 使用JSON.parse()函数 this.dataList = JSON.parse(dataList); ...
- PM过程能力成熟度3级
2级PM已经可以把项目管理起来了.如果这时候,企业只有一个PM,那这种程度的管理,只要逐渐深化,就可以一直维持下去. 然鹅,现实总是复杂很多... 公司会在PM建立2级的过程管理后,提高所有项目的可视 ...
- curl 命令-接口测试
在linux/Unix 为代表的os上, 对后端进行测试, 模拟连接请求都会书写脚本 场景: 在Linux 上接口测试工具有ab, restClient, postman等, 最常用的方法是curl进 ...
- 好代码是管出来的——使用GitHub实现简单的CI/CD
软件开发一般来说是一项团队作业,在本系列文章开始就提到过软件的编码是由一个团队“并行”完成的,为了保证编码任务正常完成,首先引入版本控制工具来完成代码管理,为了保证代码质量引入了代码分析器以及代码测试 ...
- Windows Server 2016-Telnet 简介及安装
Telnet是基于请求注释(RFC)854的因特网标准程序和协议,该RFC规定了一种在网络上发送和接收未加密的ASCII字符(明文)的方法.Telnet包含两个功能模块:Telnet客户端和Telne ...