c++ 平衡树- 替罪羊树(非旋转)

embedded/2024/10/20 7:08:27/

洛谷真题

**#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <chrono>
#include <climits>
#include <cmath>
#include <complex>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <vector>
using namespace std;#include <bits/stdc++.h>
const int maxn = 1e5 + 5;
const double alpha = 0.75;
struct Node {int l, r, size, fact, val, exist;
} tr[maxn];
int cnt, root;
#define get tr[now]
#define getl tr[get.l]
#define getr tr[get.r]int newNode(int v) {int now = ++cnt;get.val = v;get.size = get.fact = get.exist = 1;return now;
}bool isBanlance(int now) {// 左右子树不平衡 or 删除的节点太多if (get.size * alpha < max(getl.size, getr.size) or get.size * 0.7 > get.fact) {return false;}return true;
}void reset(int now) {get.l = get.r = 0;get.size = get.fact = get.exist = 1;
}vector<int> v;void collect(int now) {if (!now) return;collect(get.l);if (get.exist) {v.push_back(now);}collect(get.r);
}void lift(int &now, int l, int r) {//if (!now) return; sb 加了这一行代码if (l == r) {now = v[l];reset(now);return;}int m = (l + r) >> 1;while (m > l and tr[v[m]].val == tr[v[m - 1]].val) m--;now = v[m];if (m > l) lift(get.l, l, m - 1);else {get.l = 0;}lift(get.r, m + 1, r);get.size = getl.size + getr.size + 1;get.fact = get.size;get.exist = 1;
}void update(int now, int end) {if (!now) return;if (tr[end].val < get.val) {update(get.l, end);}  else {update(get.r, end);}get.size = getl.size + getr.size + 1;
}void rebuild(int& now) {if (!now) return;v.clear();collect(now);if (v.empty()) {now = 0;return;}lift(now, 0, v.size() - 1);update(root, now);
}void check(int& now, int end) {if (now == end) return;if (!isBanlance(now)) {rebuild(now);return;}if (tr[end].val < get.val) {check(get.l, end);} else {check(get.r, end);}
}void ins(int& now, int v) {if (!now) {now = newNode(v);check(root, now);return;}get.size++;get.fact++;if (v < get.val) {ins(get.l, v);} else {ins(get.r, v);}
}void del(int& now, int v) {if (!now) {return;}get.fact--;if (get.exist and get.val == v) {get.exist = 0;check(root, now);return;}if (v < get.val) {del(get.l, v);} else {del(get.r, v);}
}int getrank(int val) {int now = root, rank = 1;while (now) {if (val <= get.val) {now = get.l;} else {rank += getl.fact + get.exist;now = get.r;}}return rank;
}int getnum(int rank) {int now = root;while (now) {if (get.exist and getl.fact + 1 == rank) {break;}if (getl.fact >= rank) {now = get.l;} else {rank -= getl.fact + get.exist;now = get.r;}}return get.val;
}int main() {int t, opt, x;cin >> t;while (t--) {cin >> opt >> x;switch(opt){case 1:ins(root,x);break;case 2:del(root,x);break;case 3:cout << getrank(x) << endl;break;case 4:cout << getnum(x) << endl;break;case 5:cout << getnum(getrank(x)-1) << endl;break;case 6:cout << getnum(getrank(x+1)) << endl;break;}}
}

http://www.ppmy.cn/embedded/128925.html

相关文章

WPF常见容器全方位介绍

Windows Presentation Foundation (WPF) 是微软的一种用于构建Windows桌面应用程序的UI框架。WPF的布局系统基于容器&#xff0c;帮助开发者以灵活、响应的方式组织用户界面 (UI) 元素。本篇文章将详细介绍WPF中几种常见的容器&#xff0c;包括Grid、StackPanel、WrapPanel、Do…

【DevOps工具篇】Docker的DNS原理

在使用 Docker 容器时,网络在实现容器与外界之间的通信方面起着至关重要的作用。容器网络的一个基本方面是 DNS(域名系统),它允许容器使用域名而不是依赖 IP 地址来发现彼此并相互通信。在本文中,我们将探讨 Docker DNS 以及它如何促进容器通信。 🔎 什么是 DNS? 域名…

基于SpringBoot+Vue+uniapp的诗词学习系统的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

[C#][winform]基于yolov8的道路交通事故检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面

【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎&#xff0c;使用CPU进行推理&#xff0c;适合有显卡或者没有显卡windows x64系统均可&#xff0c;不支持macOS和Linux系统&#xff0c;不支持x86的windows操作系统。由于采用CPU推理&#xff0c;要比GPU慢。…

wireshark或tshark提取tcpdump捕获的数据包(附python脚本自动解析文件后缀)

tcpdump 捕获数据包后&#xff0c;保存的文件通常会被命名为 capture.pcap&#xff08;或其他你指定的名称&#xff09;&#xff0c;并存储在你运行命令的当前目录中。以下是如何使用 tcpdump 进行流量捕获&#xff0c;并找到和使用捕获文件的详细步骤。 1. 使用 tcpdump 捕获…

应用层协议 序列化

自定义应用层协议 例子&#xff1a;网络版本计算器 序列化反序列化 序列化&#xff1a;将消息&#xff0c;昵称&#xff0c;日期整合成消息-昵称-日期 反序列化&#xff1a;消息-昵称-日期->消息&#xff0c;昵称&#xff0c;日期 在序列化中&#xff0c;定义一个结构体…

IDEA中的快捷键大全--超详细

目录 一、通用类型 1.1 图示 1.2 表格化 二、编写速度提升 2.1 图示 2.1.1 表格化 2.2 图示 2.2.1 表格化: 三、类结构,查找和查看源码 3.1 图示 3.2 表格化 四、查找,替换和关闭 4.1图示 4.2 表格化 五、调整格式 5.1 图示 5.2 表格化 六、快捷键的自主定义…

Lua 语言中的注释详解

软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 引言 在编程中&#xff0c;注释是代码的重要组成部分&#xff0c;它帮助开发者理解和维护代码。Lua&#xff0c;作为一种轻量级的脚本语言&#xff0c;也提…