Luogu P3377【模板】左偏树(可并堆)
时间:2019-11-26
本文章向大家介绍Luogu P3377【模板】左偏树(可并堆),主要包括Luogu P3377【模板】左偏树(可并堆)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
采用了jls的左偏树写法,非常好写...
额外用一个并查集维护集合关系即可,注意路径压缩。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define LOG(...) fprintf (stderr, __VA_ARGS__)
#define pb push_back
#define mp make_pair
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(), (x).end()
const int INF = 0x3f3f3f3f, N = 100005;
const LL INFL = 0x3f3f3f3f3f3f3f3fll;
int n, m, rt[N], cnt, f[N], a[N];
struct HeapNode {
int w, ls, rs, sz;
HeapNode (int w=0, int ls=0, int rs=0, int sz=0): w(w), ls(ls), rs(rs), sz(sz){}
}e[N];
int find (int x) {
return x == f[x] ? f[x] : f[x] = find(f[x]);
}
int merge (int x, int y) {
if (!x || !y) return x+y;
if (e[x].w > e[y].w || (e[x].w == e[y].w && x > y)) swap(x, y);
e[x].rs = merge(e[x].rs, y);
if (e[e[x].rs].sz > e[e[x].ls].sz) swap(e[x].ls, e[x].rs);
e[x].sz = e[e[x].rs].sz + 1;
return x;
}
int main() {
#ifdef LiM_817
double cl = clock();
freopen ("input.txt", "r", stdin);
#endif
scanf ("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
rt[i] = ++cnt; f[i] = i;
int w; scanf ("%d", &w);
a[i] = w;
e[rt[i]] = (HeapNode) {w, 0, 0, 1};
}
while (m--) {
int op, x, y;
scanf ("%d%d", &op, &x);
if (op == 1) {
scanf ("%d", &y);
if (a[x] == -1 || a[y] == -1) continue;
x = find(x), y = find(y);
rt[x] = merge(rt[x], rt[y]);
f[y] = x;
}
else if (op == 2) {
if (a[x] == -1) {
puts("-1");
continue;
}
int t = find(x);
printf ("%d\n", e[rt[t]].w);
a[rt[t]] = -1;
rt[t] = merge(e[rt[t]].ls, e[rt[t]].rs);
}
}
#ifdef LiM_817
cerr << fixed << setprecision(2) << "Time ellapsed: " << ((double)(clock() - cl) / CLOCKS_PER_SEC) << "s\n";
#endif
return 0;
}
原文地址:https://www.cnblogs.com/LiM-817/p/11934607.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python发邮件脚本,Python调用163邮箱SMTP服务实现邮件群发
- 为PXC集群引入Mycat并构建完整的高可用集群架构
- Python3 字典
- 安装Percona Server数据库(in CentOS 8)
- Python 基础篇-正斜杠("/")和反斜杠("")的用法
- 在CentOS8下搭建PXC集群
- Python 基础篇-相对路径、绝对路径的写法
- Python3 元组
- 关于MySQL的基准测试
- Python 技术篇-操作excel,对excel进行读取和写入
- Mycat 整合 MySQL 8.x 踩坑实践
- Python 技术篇-xlwt库不新建,直接读取已存在的excel并写入
- Python3 列表
- Mycat 核心配置详解
- Python字符串