Double Queue

本打算学二叉树,单纯的二叉树感觉也就那几种遍历了, 无意中看到了这个题,然后就花了两天时间又去学了学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花式水过!的更多相关文章

  1. POJ 3481 Double Queue (treap模板)

    Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Bucharest ...

  2. POJ 3481 Double Queue STLmap和set新学到的一点用法

    2013-08-08 POJ 3481  Double Queue 这个题应该是STL里较简单的吧,用平衡二叉树也可以做,但是自己掌握不够- -,开始想用两个优先队列,一个从大到小,一个从小到大,可是 ...

  3. POJ 3481 Double Queue(Treap模板题)

    Double Queue Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15786   Accepted: 6998 Des ...

  4. poj 3841 Double Queue (AVL树入门)

    /****************************************************************** 题目: Double Queue(poj 3481) 链接: h ...

  5. POJ 3481 Double Queue(STL)

    题意  模拟银行的排队系统  有三种操作  1-加入优先级为p 编号为k的人到队列  2-服务当前优先级最大的   3-服务当前优先级最小的  0-退出系统 能够用stl中的map   由于map本身 ...

  6. POJ 3481 Double Queue(set实现)

    Double Queue The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Buchares ...

  7. POJ 3481 Double Queue

    平衡树.. 熟悉些fhq-Treap,为啥我在poj读入优化不能用啊 #include <iostream> #include <cstdio> #include <ct ...

  8. treap树---Double Queue

    HDU   1908 Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office i ...

  9. poj 2761 Feed the dogs (treap树)

    /************************************************************* 题目: Feed the dogs(poj 2761) 链接: http: ...

随机推荐

  1. Android - Zxing实现二维码的扫描与生成

    Zxing: Zxing是一个开放源码,用java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.可以实现使用手机内置摄像头完成条形码的扫描以及解码. github:     ...

  2. 【extjs6学习笔记】0.2 准备:类库结构

  3. JavaEE汇总

    1.简述Spring. a)      Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,其目的是解决企业应用开发的复杂性,能够使用基本的JavaBean代替EJB,并提供了 ...

  4. sql server Cannot resolve the collation conflict between "Chinese_PRC_BIN" and "Chinese_PRC_CI_AS" in the equal to operation

    今天查询二个db,出现这个错误,二种方法,一种是把db里的collation改成一样的:如果不方便可以直接在sql语句后面转一下: select * from table where crm_mscr ...

  5. Maven添加本地依赖

    在写本文的时候先来说明一下maven依赖的各种范围的意思 compile(编译范围)       compile 是默认的范围:如果没有提供一个范围,那该依赖的范围就是编译范围.编译范围依赖在所有的c ...

  6. js 判断是什么浏览器、是否为谷歌浏览器

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http ...

  7. Robot Framework(十一) 执行测试用例——后处理输出

    3.3后处理输出 在测试执行期间生成的XML输出文件可以在之后由rebot工具进行后处理,该工具是Robot Framework的组成部分.在测试执行期间生成测试报告和日志时会自动使用它,但在执行后也 ...

  8. java POI技术之导出数据优化(15万条数据1分多钟)

    专针对导出excel2007 ,用到poi3.9的jar package com.cares.ynt.util; import java.io.File; import java.io.FileOut ...

  9. PHP的PDF扩展库TCPDF将中文字体设置为内嵌字体的方法

    1. 下载要设置的字体,如名为simfang.ttf,放在./vendor/tecnickcom/tcpdf/tools目录中 2.在tools目录中按住shift,点击鼠标右键,点击“在此处打开命令 ...

  10. MYSQL 注射精华

    前言鄙人今天心血来潮突然想写篇文章,鄙人从来没写过文章,如果有错误的地方请多多指教.本文需要有基础的SQL语句知识才可以更好的理解.建议想学习的人多去了解一下SQL语句和编程语言,知己知彼才能百战百胜 ...