题目链接: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的更多相关文章

  1. BZOJ 3224 - 普通平衡树 - [Treap][Splay]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3224 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...

  2. BZOJ - 3224 可持久化Treap 树形操作

    这个题目去年就做过了,这次稍微改了一下 都是基础操作 #include<iostream> #include<algorithm> #include<cstdio> ...

  3. Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...

  4. BZOJ 3224 普通平衡树(Treap模板题)

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 14301  Solved: 6208 [Submit][ ...

  5. 使用AI算法进行手写数字识别

    人工智能   人工智能(Artificial Intelligence,简称AI)一词最初是在1956年Dartmouth学会上提出的,从那以后,研究者们发展了众多理论和原理,人工智能的概念也随之扩展 ...

  6. 【Win 10 应用开发】手写识别

    记得前面(忘了是哪天写的,反正是前些天,请用力点击这里观看)老周讲了一个14393新增的控件,可以很轻松地结合InkCanvas来完成涂鸦.其实,InkCanvas除了涂鸦外,另一个大用途是墨迹识别, ...

  7. JS / Egret 单笔手写识别、手势识别

    UnistrokeRecognizer 单笔手写识别.手势识别 UnistrokeRecognizer : https://github.com/RichLiu1023/UnistrokeRecogn ...

  8. 如何用卷积神经网络CNN识别手写数字集?

    前几天用CNN识别手写数字集,后来看到kaggle上有一个比赛是识别手写数字集的,已经进行了一年多了,目前有1179个有效提交,最高的是100%,我做了一下,用keras做的,一开始用最简单的MLP, ...

  9. 【转】机器学习教程 十四-利用tensorflow做手写数字识别

    模式识别领域应用机器学习的场景非常多,手写识别就是其中一种,最简单的数字识别是一个多类分类问题,我们借这个多类分类问题来介绍一下google最新开源的tensorflow框架,后面深度学习的内容都会基 ...

随机推荐

  1. ruby 数据类型String

    一.字符串创建 单引号包含,不支持转义符和内嵌表达式#{}(插值符) str = 'hello world!' 双引号包含 str = "hello world!" 使用%,%Q, ...

  2. Leecode刷题之旅-C语言/python-53.最大子序和

    /* * @lc app=leetcode.cn id=53 lang=c * * [53] 最大子序和 * * https://leetcode-cn.com/problems/maximum-su ...

  3. (数据科学学习手册28)SQL server 2012中的查询语句汇总

    一.简介 数据库管理系统(DBMS)最重要的功能就是提供数据查询,即用户根据实际需求对数据进行筛选,并以特定形式进行显示.在Microsoft SQL Serve 2012 中,可以使用通用的SELE ...

  4. R语言学习笔记(八):零碎知识点(16-20)

    16--complete.cases( ) complete.case()可以判断对象中是否数据完全,然后返回TRUE, FALSE 这一函数在去除数据框中缺失值时很有用. > d kids a ...

  5. 「LibreOJ#515」贪心只能过样例 (暴力+bitset)

    可以发现,答案最大值只有106,于是想到用暴力维护 可以用bitset合并方案可以优化复杂度, Code #include <cstdio> #include <bitset> ...

  6. java第二章 变量和运算符

      Java 基础应用编程——  变量和运算符 1.Java程序结构          数据类型:确定要存储在内存中的数据的类型.          变量:是存储数据的基本单元 2.变量的概念   变 ...

  7. Python标准库--inspect

    inspect模块是针对模块,类,方法,功能等对象提供些有用的方法.例如可以帮助我们检查类的内容,检查方法的代码,提取和格式化方法的参数等. import inspect import os clas ...

  8. 设计模式——模版方法模式详解(论沉迷LOL对学生的危害)

    .  实例介绍 在本例中,我们使用一个常见的场景,我们每个人都上了很多年学,中学大学硕士,有的人天生就是个天才,中学毕业就会微积分,因此得了诺贝尔数学奖:也有的人在大学里学了很多东西,过得很充实很满意 ...

  9. Android各版本代号、版本号、API/NDK级别、发布时间

    代号 版本号 API/NDK级别 发布时间 牛轧糖 Nougat 7.1.2 API level 25 2017-2 7.1.1 2016-10 7.0 API level 24 2016-05 棉花 ...

  10. Leetcode 673.最长递增子序列的个数

    最长递增子序列的个数 给定一个未排序的整数数组,找到最长递增子序列的个数. 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[ ...