题意:让你维护一个集合,有8种操作:

1.  I x  插入一个数

2.  R x 删除x

3.  S 输出总的数个数(集合大小)

4.  L x  查询小于x的数的个数

5.  W k  查询集合中数从小到大排列的第k个数

6.  C x  查询x的个数

7.  MI  查询集合中最小的数

8.  MA 查询集合中最大的数

一道平衡树模拟的裸题,直接套版然后改下细节就行了。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std; struct node
{
node *ch[];
int v,r,sz,cnt;
void UP(){ sz = ch[]->sz + ch[]->sz + cnt; }
int cmp(int x)const
{
if(x == v) return -;
return x > v;
}
}*null,*root; void create(node *&o,int v=)
{
o = new node();
o->sz = o->cnt = ;
o->v = v;
o->r = rand();
o->ch[] = o->ch[] = null;
} void rotate(node *&o,int d)
{
node *p = o->ch[d];
o->ch[d] = p->ch[d^];
p->ch[d^] = o;
o->UP(),p->UP();
o = p;
} int countx(node *o,int v)
{
while(o != null)
{
int d = o->cmp(v);
if(d == -)
return o->cnt;
o = o->ch[d];
}
return ;
} void insert(node *&o,int v)
{
if(o == null)
{
create(o,v);
return;
}
int d = o->cmp(v);
if(d == -)
{
o->cnt++;
o->UP();
return;
}
insert(o->ch[d],v);
if(o->r > o->ch[d]->r)
rotate(o,d);
if(o != null)
o->UP();
} void del(node *&o,int v)
{
if(o == null) return;
int d = o->cmp(v);
if(d == -)
{
if(o->cnt > )
o->cnt--;
else
{
if(o->ch[] == null) o = o->ch[];
else if(o->ch[] == null) o = o->ch[];
else
{
int d2 = o->ch[]->r < o->ch[]->r;
if(o->ch[d2] == null)
{
delete o;
o = null;
return;
}
rotate(o,d2);
del(o->ch[d2^],v);
}
}
}
else del(o->ch[d],v);
if(o != null)
o->UP();
} int Kth(node *o,int k)
{
if(o == null || k == || k > o->sz) return -;
int left = o->ch[]->sz;
if(k > left && k <= left + o->cnt)
return o->v;
if(k > left + o->cnt)
return Kth(o->ch[],k-left-o->cnt);
return Kth(o->ch[],k);
} int Count(node *o,int v)
{
if(o == null) return ;
int left = o->ch[]->sz;
if(o->v == v) return left;
else if(v < o->v)
return Count(o->ch[],v);
return Count(o->ch[],v)+left+o->cnt;
} void init()
{
create(null);
null->sz = ;
root = null;
} int main()
{
int t,n,i,x;
char ss[];
scanf("%d",&t);
while(t--)
{
init();
scanf("%d",&n);
while(n--)
{
scanf("%s",ss);
if(ss[] == 'M')
{
if(ss[] == 'I')
printf("%d\n",Kth(root,));
else
printf("%d\n",Kth(root,root->sz));
}
else if(ss[] == 'I')
{
scanf("%d",&x);
insert(root,x);
}
else if(ss[] == 'S')
{
printf("%d\n",root->sz);
}
else if(ss[] == 'R')
{
scanf("%d",&x);
del(root,x);
}
else if(ss[] == 'L')
{
scanf("%d",&x);
printf("%d\n",Count(root,x));
}
else if(ss[] == 'W')
{
scanf("%d",&x);
printf("%d\n",Kth(root,x));
}
else if(ss[] == 'C')
{
scanf("%d",&x);
printf("%d\n",countx(root,x));
}
}
}
return ;
}

UESTC 395 Dynamic Query System --Treap的更多相关文章

  1. [Liferay6.2]Liferay Dynamic Query API示例

    介绍 Liferay提供了几种方法定义复杂的查询用来检索数据库中的数据. 通常情况下,在每个service Entity中,通过定义一些'finder'方法,可以便捷地满足基本的数据查询操作. 但是, ...

  2. Mybatis Dynamic Query 框架整合

    项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...

  3. HDU 3686 Traffic Real Time Query System(双连通分量缩点+LCA)(2010 Asia Hangzhou Regional Contest)

    Problem Description City C is really a nightmare of all drivers for its traffic jams. To solve the t ...

  4. Mybatis Dynamic Query 1.0.2版本

    项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...

  5. Mybatis Dynamic Query 2.0 入门

    简介 2.0 昨天打包好了,主要是整合了tk.mybatis.mapper 到项目中去,所以和1.x比起来主要多了一个通用mapper.因为作者主要是使用springboot 这里讲一下Springb ...

  6. Mybatis Dynamic Query 2.0.2

    项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...

  7. CH#24C 逃不掉的路 和 HDU3686 Traffic Real Time Query System

    逃不掉的路 CH Round #24 - 三体杯 Round #1 题目描述 现代社会,路是必不可少的.任意两个城镇都有路相连,而且往往不止一条.但有些路连年被各种XXOO,走着很不爽.按理说条条大路 ...

  8. HDU 3686 Traffic Real Time Query System (图论)

    HDU 3686 Traffic Real Time Query System 题目大意 给一个N个点M条边的无向图,然后有Q个询问X,Y,问第X边到第Y边必需要经过的点有多少个. solution ...

  9. HDU3686 Traffic Real Time Query System 题解

    题目 City C is really a nightmare of all drivers for its traffic jams. To solve the traffic problem, t ...

随机推荐

  1. javascript对象初探(一)--- 构造器函数

    我们可以通过构造器函数(简称构造函数)来创建对象: function Her(){ this.child = 'Jon'; } 为了使用该函数来创建对象,我们需要使用new操作符,例如: var sh ...

  2. 捕获当前事件作用的对象event.target和event.srcElement

    语法: //返回事件的目标节点(触发该事件的节点). event.target //FF,Chrome event.srcElement //IE 栗子: var oDiv=document.getE ...

  3. 虚拟机克隆以后出现“需要整合虚拟机磁盘”的解决方法

    问题描述 在虚拟机克隆完毕以后,原始虚拟机提示"需要整合虚拟机磁盘" 在"任务与事件"栏中看到以下信息 解决方法 从上面可以看到是因为整合失败导致的,那么我们只 ...

  4. Scrum三大角色特点

    灵感来自于一段冷笑话: 一天,一头猪和一只鸡在路上散步,鸡看了一下猪说,“嗨,我们合伙开一家餐馆怎么样?”,猪回头看了一下鸡说,“好主意,那你准备给餐馆起什么名字呢?”,鸡想了想说“餐馆名字叫火腿和鸡 ...

  5. iOS常用手势识别器

    手势识别状态: typedef NS_ENUM(NSInteger, UIGestureRecognizerState) { // 没有触摸事件发生,所有手势识别的默认状态 UIGestureReco ...

  6. iOS开源项目MobileProject功能点介绍

    一:MobileProject简介 MobileProject项目是一个以MVC模式搭建的开源功能集合,基于Objective-C上面进行编写,意在解决新项目对于常见功能模块的重复开发,MobileP ...

  7. iOS--XML三种解析方法( XMLDictionary)、(GDataXMLNode)、(NSXMLParser)

    iOS9之后,默认网络请求是https,所有我们要设置一下网络安全,具体设置如下 1.第三方类库 XMLDictionary 下载地址: https://github.com/nicklockwood ...

  8. OC NSNumber NSValue

    OC NSNumber NSValue iOS的集合对象不可以存储C语言基本类型,所有可以进行装箱和拆箱,来进行OC对象操作. NSNumber包装类 普通初始化 NSNumber * num1 = ...

  9. [Android]listview recycleview的复用问题

    最近解决了几个bug,是关于listview和recycle view中的复用问题的:   为了提高性能,我们使用了viewHolder来减少view的生成,从而提高滑动的性能:   要注意一个很隐蔽 ...

  10. 列式存储(三)JFinal DB.tx()事务

    上一篇中说道了列式存储中新增表单时后台接收数据问题,在存入数据库时一次插入多条数据,就要用到事务. JFinal中有个封装好的事务应用,用起来非常方便简单. 写法1: Db.tx(new IAtom( ...