[bzoj 3224]手写treap
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3224
bzoj不能用time(0),看到这个博客才知道,我也RE了好几发……
#include<bits/stdc++.h>
using namespace std; struct Node
{
int val,pri,sz,cnt;
Node* ch[];
int cmp(int x) const
{
if (x==val) return -;
return x<val?:;
}
void push_up()
{
sz=cnt+ch[]->sz+ch[]->sz;
}
}*tree,*null; void rotate(Node* &node,int d)
{
Node *k=node->ch[d];
node->ch[d]=k->ch[d^];
k->ch[d^]=node;
node=k;
} void insert(Node* &node,int x)
{
if (node==null)
{
node=new Node();
node->ch[]=null;
node->ch[]=null;
node->val=x;
node->cnt=;
node->pri=rand();
node->sz=;
}
else
{
int d=node->cmp(x);
if (d==-)
{
node->cnt++;
node->sz++;
}
else
{
insert(node->ch[d],x);
if (node->pri < node->ch[d]->pri)
{
rotate(node,d);
node->ch[d^]->push_up();
}
node->push_up();
}
}
} void remove(Node* &node,int x)
{
if (node==null) return;
int d=node->cmp(x);
if (d==-)
{
if (node->cnt>)
{
node->cnt--;
node->sz--;
}
else
{
if (node->ch[]==null)
{
Node *tmp=node;
node=node->ch[];
delete tmp;
}
else if (node->ch[]==null)
{
Node *tmp=node;
node=node->ch[];
delete tmp;
}
else
{
int dd=(node->ch[]->pri)<(node->ch[]->pri)?:;
rotate(node,dd);
remove(node->ch[dd^],x);
}
}
}
else remove(node->ch[d],x);
node->push_up();
} int rk(const Node* node,int x)
{
if (node==null) return ;
if (node->val<x) return node->cnt+node->ch[]->sz+rk(node->ch[],x);
else return rk(node->ch[],x);
} int kth(const Node* node,int k)
{
if (node->ch[]==null)
{
if (node->cnt>=k) return node->val;
else return kth(node->ch[],k-node->cnt);
}
else
{
if (node->ch[]->sz>=k) return kth(node->ch[],k);
if (node->ch[]->sz+node->cnt>=k) return node->val;
return kth(node->ch[],k-node->ch[]->sz-node->cnt);
}
} int pre(Node* node,int x)
{
Node *t=node;
int res=-0x3f3f3f3f;
while (t!=null)
{
if (t->val>=x) t=t->ch[];
else res=t->val,t=t->ch[];
}
return res;
} int suc(Node* node,int x)
{
Node *t=node;
int res=0x3f3f3f3f;
while (t!=null)
{
if (t->val<=x) t=t->ch[];
else res=t->val,t=t->ch[];
}
return res;
} int main()
{
//srand((unsigned)time(NULL));
null=new Node();
null->cnt=;
null->sz=;
null->pri=-;
null->ch[]=null;
null->ch[]=null;
tree=null;
int n;
scanf("%d",&n);
while (n--)
{
int op,x;
scanf("%d%d",&op,&x);
switch(op)
{
case : insert(tree,x); break;
case : remove(tree,x); break;
case : printf("%d\n",rk(tree,x)+); break;
case : printf("%d\n",kth(tree,x)); break;
case : printf("%d\n",pre(tree,x)); break;
case : printf("%d\n",suc(tree,x)); break;
}
}
return ;
}
[bzoj 3224]手写treap的更多相关文章
- BZOJ 3224 - 普通平衡树 - [Treap][Splay]
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3224 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...
- BZOJ - 3224 可持久化Treap 树形操作
这个题目去年就做过了,这次稍微改了一下 都是基础操作 #include<iostream> #include<algorithm> #include<cstdio> ...
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- BZOJ 3224 普通平衡树(Treap模板题)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 14301 Solved: 6208 [Submit][ ...
- 使用AI算法进行手写数字识别
人工智能 人工智能(Artificial Intelligence,简称AI)一词最初是在1956年Dartmouth学会上提出的,从那以后,研究者们发展了众多理论和原理,人工智能的概念也随之扩展 ...
- 【Win 10 应用开发】手写识别
记得前面(忘了是哪天写的,反正是前些天,请用力点击这里观看)老周讲了一个14393新增的控件,可以很轻松地结合InkCanvas来完成涂鸦.其实,InkCanvas除了涂鸦外,另一个大用途是墨迹识别, ...
- JS / Egret 单笔手写识别、手势识别
UnistrokeRecognizer 单笔手写识别.手势识别 UnistrokeRecognizer : https://github.com/RichLiu1023/UnistrokeRecogn ...
- 如何用卷积神经网络CNN识别手写数字集?
前几天用CNN识别手写数字集,后来看到kaggle上有一个比赛是识别手写数字集的,已经进行了一年多了,目前有1179个有效提交,最高的是100%,我做了一下,用keras做的,一开始用最简单的MLP, ...
- 【转】机器学习教程 十四-利用tensorflow做手写数字识别
模式识别领域应用机器学习的场景非常多,手写识别就是其中一种,最简单的数字识别是一个多类分类问题,我们借这个多类分类问题来介绍一下google最新开源的tensorflow框架,后面深度学习的内容都会基 ...
随机推荐
- HTTP学习之HTTP基础
学习HTTP技术,首先要了解它的在web通信中有哪些特点,起到什么作用.有哪些规范.都有什么功能. HTTP的特点 HTTP使用的是一种可靠的.快速响应的数据传输协议,用户一旦发起请求,Web服务器可 ...
- haproxy + keepalived 实现高可用负载均衡集群
1. 首先准备两台tomcat机器,作为集群的单点server. 第一台: 1)tomcat,需要Java的支持,所以同样要安装Java环境. 安装非常简单. tar xf jdk-7u65-lin ...
- 《Go语言实战》书摘
书籍简介 名称:Go语言实战 作者: 威廉·肯尼迪 (William Kennedy) / 布赖恩·克特森 (Brian Ketelsen) / 埃里克·圣马丁 (Erik St.Martin) 内容 ...
- JAVA多进程入门
概念 并行和并发 并行:物理上的实现,在同一时间点上发生 并发:两个事件在一个时间段内发生,如单片机的单核多线程 进程和线程 进程:一个应用程序可以有多个进程,每一个进程有一个独立的内存空间 线程:一 ...
- Android开发——Google关于Application Not Responding的建议
秒内没有执行完毕. 2. 避免ANR的一些建议 Android applications normally run entirely on asingle (i.e. main) thre ...
- LeetCode:27. Remove Element(Easy)
1. 原题链接 https://leetcode.com/problems/remove-element/description/ 2. 题目要求 给定一个整数数组 nums[ ] 和一个整数 val ...
- 修改npm全局安装模式的路径
由于npm全局模块的存放路径及cache的路径默认是放在C盘下,这样肯定会增加C盘的负担,那么如果需要修改其存放路径应该怎么做呢? 第一步:在nodejs安装目录(也可以指定其它目录)下创建”node ...
- 修改有数据oracle字段类型 从number转为varchar
--修改有数据oracle字段类型 从number转为varchar--例:修改ta_sp_org_invoice表中RESCUE_PHONE字段类型,从number转为varchar --step1 ...
- 九度OJ--1163(C++)
#include <iostream>#include <vector> using namespace std; int main() { int n; while(cin& ...
- lintcode-64-合并排序数组 II
64-合并排序数组 II 合并两个排序的整数数组A和B变成一个新的数组. 注意事项 你可以假设A具有足够的空间(A数组的大小大于或等于m+n)去添加B中的元素. 样例 给出 A = [1, 2, 3, ...