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: ...
随机推荐
- Android - Zxing实现二维码的扫描与生成
Zxing: Zxing是一个开放源码,用java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.可以实现使用手机内置摄像头完成条形码的扫描以及解码. github: ...
- 【extjs6学习笔记】0.2 准备:类库结构
- JavaEE汇总
1.简述Spring. a) Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,其目的是解决企业应用开发的复杂性,能够使用基本的JavaBean代替EJB,并提供了 ...
- 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 ...
- Maven添加本地依赖
在写本文的时候先来说明一下maven依赖的各种范围的意思 compile(编译范围) compile 是默认的范围:如果没有提供一个范围,那该依赖的范围就是编译范围.编译范围依赖在所有的c ...
- js 判断是什么浏览器、是否为谷歌浏览器
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http ...
- Robot Framework(十一) 执行测试用例——后处理输出
3.3后处理输出 在测试执行期间生成的XML输出文件可以在之后由rebot工具进行后处理,该工具是Robot Framework的组成部分.在测试执行期间生成测试报告和日志时会自动使用它,但在执行后也 ...
- java POI技术之导出数据优化(15万条数据1分多钟)
专针对导出excel2007 ,用到poi3.9的jar package com.cares.ynt.util; import java.io.File; import java.io.FileOut ...
- PHP的PDF扩展库TCPDF将中文字体设置为内嵌字体的方法
1. 下载要设置的字体,如名为simfang.ttf,放在./vendor/tecnickcom/tcpdf/tools目录中 2.在tools目录中按住shift,点击鼠标右键,点击“在此处打开命令 ...
- MYSQL 注射精华
前言鄙人今天心血来潮突然想写篇文章,鄙人从来没写过文章,如果有错误的地方请多多指教.本文需要有基础的SQL语句知识才可以更好的理解.建议想学习的人多去了解一下SQL语句和编程语言,知己知彼才能百战百胜 ...