「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\)串一定是从左到右,能 ...
随机推荐
- asp.net 仿微信端菜单设置
第一步:添加引用文件 <link rel="stylesheet" href="~/assets/css/bootstrap.min.css"> & ...
- 客户端浏览器- UWP兼容版本WebView
WebView简介 在win10之前,浏览器控件有WPF版本webBrowser.Winform版本WebBrowser,浏览器内核为IE. win10之后,微软不再维护原有的WebBrowser,转 ...
- Python基础学习01
1.编译型解释型语言区别: 编译型:一次性将全部代码编译成二进制文件,代表c,c++ 优点:执行效率高 缺点:开发速度慢,不能跨平台 解释型:当程序运行时,从上至下一行一行执行,解释成二进制去执行 优 ...
- MySQL InnoDB 存储引擎探秘
在MySQL中InnoDB属于存储引擎层,并以插件的形式集成在数据库中.从MySQL5.5.8开始,InnoDB成为其默认的存储引擎.InnoDB存储引擎支持事务.其设计目标主要是面向OLTP的应用, ...
- 前后端分离密码登陆加密RSA方案(java后端)
前言:密码加密有很多种方案,这里不做过多讨论,本篇文章是基于RSA加密实现. 首先在前端工程中需要引入加密js: "jsencrypt": "2.3.1",(注 ...
- 利用data-src属性 更换图片
<div class="img_src"> <img src="./images/luo.png"></div> <u ...
- python的学习笔记01_3 基本运算符 流程控制if while 字符串常用办法
基本运算符 运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算,今天我们暂只学习算数运算.比较运算.逻辑运 ...
- Python数据处理与计算——概述
Python是一种面向对象的,动态的程序设计语言,具有非常简洁而清晰的语法,适合于完成各种高层任务.它既可以用来快速开发程序脚本,也可以用来开发大规模的软件. 随着NumPy.SciPy.Matplo ...
- U盘启动盘安装Windows10操作系统详解
没有装过系统的同学,总以为装系统很神秘?是专业技术人员干的事情.今天我们来看看怎么借助常用的U盘装上全新的win10系统. 准备材料: 软件软碟通,可上官网下载:https://cn.ultraiso ...
- nexus 10 救砖 安装lineage OS 15 并 root
因为平板自带的谷歌应用太烦人了,想root之后卸载它们. 一.root nexus 10 官方系统 1.把img拷贝到platform-tools(Android官网下载)文件夹 2.platform ...