POJ-3481 Double Queue,Treap树和set花式水过!
本打算学二叉树,单纯的二叉树感觉也就那几种遍历了, 无意中看到了这个题,然后就花了两天时间又去学了学Treap树,真的不好理解,真应该从基础开始的,但我比较倔强,看到这题一定要先做了再说。上午和某公众号交流了一下,初学,不明白为什么要借助随机优先值来修正,而这题本身自带优先值,为什么不能用这个来修正呢,给出的回答是:为了保证平衡,因为键值生成的BST树有很多种形态,需要另外一个key来保证二叉树的形态,而固定的函数在某些特殊情况下可能会不平衡,所以随机值比较靠谱。题目中所给的优先级不能保证树的形态,随机数辅助性的修正树的形态。还是有点不明白,先来个题解以后回过来应该更好理解了吧。
当然,这题典型用treap树做,但set、map、SBT、splay都可以的。下面给出Treap和set的方法,set这个相比要更简单,但treap有着set不可比拟的优势!
Treap
struct node
{
node *ch[2];
int r,k,p;
node(int kk,int pp)
{
r=rand();
k=kk,p=pp;
ch[0]=ch[1]=NULL;
}
int cmp(int x)
{
if(x==p) return -1;
return x<p?0:1;
}
};
int find(node *root,int d)
{
while(root->ch[d])
{
root=root->ch[d];
}
printf("%d\n",root->k);
return root->p;
}
void rotate(node *&root,int d)
{
node *tmp=root->ch[d^1];
root->ch[d^1]=tmp->ch[d];
tmp->ch[d]=root;
root=tmp;
}
void insert(node *&root,int k,int p)
{
if(root==NULL) root=new node(k,p);
else
{
int d=p < root->p?0:1;
insert(root->ch[d],k,p);
if(root->ch[d]->r > root->r)//破坏了树的形态
rotate(root,d^1);
}
}
void remove(node *&root,int v)
{
int d=root->cmp(v);
if(d==-1)
{
node *tmp=root;
if(root->ch[1]&&root->ch[0])
{
int d2=root->ch[1]->r < root->ch[0]->r?1:0;
rotate(root,d2);//哪边小就往哪边旋转
remove(root->ch[d2],v);
}
else
{
if(root->ch[0]==NULL) root=root->ch[1];
else root=root->ch[0];
delete tmp;//记得删除节点;
}
}
else remove(root->ch[d],v);
}
int main()
{
int n;
node *root=NULL;
while(~scanf("%d",&n)&&n)
{
if(n==1)
{
int k,p;
scanf("%d%d",&k,&p);
insert(root,k,p);
}
else
{
if(root==NULL) printf("0\n");
else
{
int d=(n==2)?1:0;
int v=find(root,d);
remove(root,v);
}
}
}
return 0;
}
set
struct p
{
int r,k;
bool operator <(const p& tmp)const//自定义优先级
{return r<tmp.r;}
};
set<p>q;
int main()
{
q.clear();
int n;
while(~scanf("%d",&n)&&n)
{
if(n==1)
{
int k,r;
scanf("%d%d",&k,&r);
p tmp=(p){r, k};
q.insert(tmp);
}
else
{
if(q.size()==0) printf("0\n");
else
{
set<p>::iterator it;
if(n==2) it=--q.end();
else it=q.begin();
printf("%d\n",it->k);
q.erase(it);
}
}
}
return 0;
}
边学边做,越学发现自己不会的越多,但至少自己是在进步,加油!
POJ-3481 Double Queue,Treap树和set花式水过!的更多相关文章
- POJ 3481 Double Queue (treap模板)
Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Bucharest ...
- POJ 3481 Double Queue STLmap和set新学到的一点用法
2013-08-08 POJ 3481 Double Queue 这个题应该是STL里较简单的吧,用平衡二叉树也可以做,但是自己掌握不够- -,开始想用两个优先队列,一个从大到小,一个从小到大,可是 ...
- POJ 3481 Double Queue(Treap模板题)
Double Queue Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15786 Accepted: 6998 Des ...
- poj 3841 Double Queue (AVL树入门)
/****************************************************************** 题目: Double Queue(poj 3481) 链接: h ...
- POJ 3481 Double Queue(STL)
题意 模拟银行的排队系统 有三种操作 1-加入优先级为p 编号为k的人到队列 2-服务当前优先级最大的 3-服务当前优先级最小的 0-退出系统 能够用stl中的map 由于map本身 ...
- POJ 3481 Double Queue(set实现)
Double Queue The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Buchares ...
- POJ 3481 Double Queue
平衡树.. 熟悉些fhq-Treap,为啥我在poj读入优化不能用啊 #include <iostream> #include <cstdio> #include <ct ...
- treap树---Double Queue
HDU 1908 Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office i ...
- poj 2761 Feed the dogs (treap树)
/************************************************************* 题目: Feed the dogs(poj 2761) 链接: http: ...
随机推荐
- SpringBoot学习笔记-Chapter2(hello word)
开篇 第一次在博客园上写博客,初衷是想记录一下学习笔记,以往都是用笔去记录下学习笔记,现在来看在效率.检索速度上以及可可复制性都不好.作为一名Java开发人员 不会Spring Boot一定会被鄙视的 ...
- Spring AOP初步总结(一)
学习AOP有段时间了,一直没空总结一下,导致有些知识点都遗忘了,之后会把以前学过的Spring核心相关的知识点总结一轮... 先大体介绍下Spring AOP的特点(均摘自"Spring i ...
- codeforces736D. Permutations(线性代数)
题意 $m \leqslant 500000$,题目打错了 Sol 神仙题Orz 构造矩阵$B$,使得$B[b[i]][a[i]] = 1$ 那么他的行列式的奇偶性也就对应了生成排列数列数量的奇偶性( ...
- WebService学习之旅(一)使用JAX-WS发布WebService
JAX-WS全称Java™ API for XML Web Services,是随着JDK1.6及其后续版本发布的方便Java程序员开发WebService应用的一组API,通常简称为JWS,目前版本 ...
- DVWA之命令注入(command injection)
Command injection就是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的 LOW 无论是Windows还是Linux,都可以使用&&连接多个命令 执行 ...
- sql 函数 coalesce
SQL函数 coalesce 功能: 返回参数中第一个非null的值. 语法: coalesce(参数1,参数2,参数3,...);返回第一个非null的值. 一般情况下会与Nullif()函数一起使 ...
- 在vue组件库中不能使用v-for
没事的,有点时候编辑器报错,但运行不一定出错, 在vue组件中注意template标签
- websocket 入门
什么是websocket WebSocket是HTML5新增的协议,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消息给浏览器. 为什么会出现 webs ...
- gdb插件使用方法
0x00 peda peda 安装: git clone https://github.com/longld/peda.git ~/peda echo "source ~/peda/peda ...
- PAT (Basic Level) Practise (中文)-1033. 旧键盘打字(20)
PAT (Basic Level) Practise (中文)-1033. 旧键盘打字(20) http://www.patest.cn/contests/pat-b-practise/1033 旧 ...