「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\)串一定是从左到右,能 ...
随机推荐
- winform登录功能
private void btnLogin_Click(object sender, EventArgs e) { string username = txtUserName.Text; string ...
- C# 添加枚举中文资源
在业务开发过程中,添加枚举,在固定枚举值的同时,也需要中文的文案. 如果不想添加语言资源项.添加枚举转语资源项,可以使用特性标记. 属性描述 DescriptionAttribute 先看案例: pu ...
- axios+Vue上传文件显示进度
一,前言 最近在用Vue,然后上传文件时需要显示进度,于是网上搜了一下,经过自己实测终于也弄明白了 二,效果 三,代码 HTML代码 <div id="app"> &l ...
- 如何删除织梦系统power by dedecms
很多织梦系统底部会自带power by dedecms,这个power by dedecms是什么意思呢?这个power by 是织梦系统版权信息,但是织梦系统是开源免费的,所以今天小编就和大家说说如 ...
- 从零开始搭建服务器部署web项目
前言 该教程旨在完整描述建站过程,会将博主踩过的坑尽量详细的罗列出来.整个建站流程相对较为庞大,因此做了分解,同时适合大家有针对性的查询感兴趣的部分. 一.如何拥有自己的云服务器. 二.域名的购买与解 ...
- Parcelable 小记
Parcelable 类,接口类,用于数据的序列化封装.常见的Bundle,Intent类都实现了该类. 实现该类需要实现writeToParcel和describeContents方法,最后还需 ...
- websocket简单实现在线聊天
WebSocket简介与消息推送 B/S架构的系统多使用HTTP协议,HTTP协议的特点: 1 无状态协议2 用于通过 Internet 发送请求消息和响应消息3 使用端口接收和发送消息,默认为80端 ...
- serialize()与serializeArray()
1.了解serialize()与serializeArray() serialize()序列化表单元素,用于ajax请求, serializeArray()序列化表单元素,类似于serialize,但 ...
- vue踩坑记录:[Vue warn]: $attrs is readonly.
今天在用element-ui的DatePicker日期选择器的时候,发现每当点击一次这个组件,控制台就会报警告`[Vue warn]: $attrs is readonly`,但是也不影响实际操作效果 ...
- oracle 行列转换
oracle 行列转换列名如果是数字,用双引号包住 如下: -- 建表 create table workinfo(wid integer primary key,sid integer ,CON ...