BZOJ3224——Tyvj 1728 普通平衡树
1、题目大意:数据结构题,是treap,全都是treap比较基本的操作
2、分析:没啥思考的
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
struct Node{
Node *ch[2];
int r, v, s, num;
bool operator < (const Node& rhs) const{
return r < rhs.r;
}
int cmp(int x){
if(x < v) return 0;
if(x == v) return -1;
return 1;
}
int cmp1(int x){
int k = num;
if(ch[0]) k += ch[0] -> s;
if(k - num + 1 <= x && x <= k) return -1;
if(x <= k - num) return 0;
return 1;
}
void maintain(){
s = num;
if(ch[0]) s += ch[0] -> s;
if(ch[1]) s += ch[1] -> s;
}
};
struct treap{
Node ft[5000000];
int tot;
Node *root;
void rotate(Node* &o, int d){
Node* k = o -> ch[d ^ 1];
o -> ch[d ^ 1] = k -> ch[d];
k -> ch[d] = o;
o -> maintain();
k -> maintain();
o = k;
}
void insert(Node* &o, int x){
if(o == NULL){
o = &ft[tot ++];
o -> ch[0] = o -> ch[1] = NULL;
o -> v = x;
o -> r = rand();
o -> num = o -> s = 1;
return;
}
int d = o -> cmp(x);
if(d == -1) o -> num ++;
else {
insert(o -> ch[d], x);
if(o -> ch[d] > o) rotate(o, d ^ 1);
}
o -> maintain();
}
void remove(Node* &o, int x){
int d = o -> cmp(x);
if(d == -1){
if(o -> num > 1) o -> num --;
else if(o -> ch[0] && o -> ch[1]) {
int d2 = 0;
if(o -> ch[0] > o -> ch[1]) d2 = 1;
rotate(o, d2);
remove(o -> ch[d2], x);
}
else {
if(o -> ch[0]){
o = o -> ch[0];
}
else o = o -> ch[1];
}
}
else remove(o -> ch[d], x);
if(o) o -> maintain();
}
int find(Node* &o, int x){
if(o == NULL) return 0;
int d = o -> cmp(x);
if(d == -1) return o -> num;
return find(o -> ch[d], x);
}
int less_k(Node* &o, int k){
if(o == NULL) return 0;
int d = o -> cmp(k);
int yy = o -> num;
if(o -> ch[0]) yy += o -> ch[0] -> s;
if(d == -1) return yy - o -> num;
else if(d == 0) return less_k(o -> ch[0], k);
else return less_k(o -> ch[1], k) + yy;
}
int kth(Node* &o, int k){
int d = o -> cmp1(k);
int yy = o -> num;
if(o -> ch[0]) yy += o -> ch[0] -> s;
if(d == -1) return o -> v;
if(d == 0) return kth(o -> ch[0], k);
return kth(o -> ch[1], k - yy);
}
} wt;
int main(){
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i ++){
int op, x;
scanf("%d%d", &op, &x);
if(op == 1){
wt.insert(wt.root, x);
}
else if(op == 2){
wt.remove(wt.root, x);
}
else if(op == 3){
printf("%d\n", wt.less_k(wt.root, x) + 1);
}
else if(op == 4){
printf("%d\n", wt.kth(wt.root, x));
}
else if(op == 5){
int yy = wt.less_k(wt.root, x);
printf("%d\n", wt.kth(wt.root, yy));
}
else{
int yy = wt.less_k(wt.root, x);
yy += wt.find(wt.root, x) + 1;
printf("%d\n", wt.kth(wt.root, yy));
}
}
return 0;
}
BZOJ3224——Tyvj 1728 普通平衡树的更多相关文章
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- bzoj3224: Tyvj 1728 普通平衡树(平衡树)
bzoj3224: Tyvj 1728 普通平衡树(平衡树) 总结 a. cout<<(x=3)<<endl;这句话输出的值是3,那么对应的,在splay操作中,当父亲不为0的 ...
- bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5354 Solved: 2196[Submit][Sta ...
- bzoj3224: Tyvj 1728 普通平衡树(splay)
3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: #include<cstdio> #include<cstring> ...
- 【权值线段树】bzoj3224 Tyvj 1728 普通平衡树
一个板子. #include<cstdio> #include<algorithm> using namespace std; #define N 100001 struct ...
- [BZOJ3224] [Tyvj 1728] 普通平衡树 (treap)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...
- BZOJ3224 Tyvj 1728 普通平衡树(Treap)
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 【权值分块】bzoj3224 Tyvj 1728 普通平衡树
权值分块和权值线段树的思想一致,离散化之后可以代替平衡树的部分功能. 部分操作的时间复杂度: 插入 删除 全局排名 全局K大 前驱 后继 全局最值 按值域删除元素 O(1) O(1) O(sqrt(n ...
- 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会
平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...
随机推荐
- segmentfault.com mongo出识以及对数组的操作
https://segmentfault.com/a/1190000003951602 首先推荐个工具,no-sql-manager-for-mongodb-professional,虽然收费,但是每 ...
- Django中Celery的实现介绍(一)
Django中Celery的实现 Celery官网http://www.celeryproject.org/ 学习资料:http://docs.jinkan.org/docs/celery/ Cele ...
- ubuntu默认防火墙
ubuntu 9.10默认的是UFW防火墙,已经支持界面操作了.在命令行运行ufw命令就可以看到提示的一系列可进行的操作. 最简单的一个操作:sudo ufw status可检查防火墙的状态,我的返回 ...
- Javascript权威指南——第一章Javascript概述
示例:javascript贷款计算器 相关技术: 1.如何在文档中查找元素: 2.如何通过表单input元素来获取用户的输入数据: 3.如何通过文档元素来设置HTML内容: 4.如何将数据存储在浏览器 ...
- Android学习笔记——download
该工程的功能是实现从网上的链接下载一个lrc文件和一个mp3文件 以下代码是MainActivity.java中的代码 package com.example.download; import com ...
- Linux下小工具使用总结
0. 前言 这篇博客仅用于记录个人在工作中用到的一个小工具,后续用到别的会再补充. 1. Tmux 终端分用器(multiplexer),可以在一个屏幕上创建多个终端,这个工具也可以用于结对编程. 个 ...
- Intent启动一个新的页面
一,Intent(目的) 的分类 显式 Intent 构造函数重载之一: Intent intent = new Intent(FirstActivity.this,SecondActivity.cl ...
- 部署openssh服务器
1.安装服务器端软件包 先查看是否已经安装openSSH服务器软件包 # rpm -qa|grep openssh openssh-askpass-.3p1-.el6_6..x86_64 openss ...
- GoLang之协程
GoLang之协程 目前,WebServer几种主流的并发模型: 多线程,每个线程一次处理一个请求,在当前请求处理完成之前不会接收其它请求:但在高并发环境下,多线程的开销比较大: 基于回调的异步IO, ...
- php对uploads文件的处理问题的解决
解决uploads问题的要点有几点: 参考这篇文章 第一, 在php.ini文件中, 有file_uploads这一节 file_uploads = On ;是否开启文件上传功能, 该功能有很大的安全 ...