poj3481 Double Queue splay

2024-06-14 09:18
文章标签 double queue splay poj3481

本文主要是介绍poj3481 Double Queue splay,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:对于某种队列有3中操作,cmd =1 ,将优先级为p的顾客k加入队列 。 cmd=2,将队列优先级最高的顾客丢出队列并输出顾

客,cmd=3,将队列优先级最低的顾客丢出队列并输出顾客。

思路:用了splay,结果压根都没旋转操作。。找优先级小的就找最左端,然后把对应指针修改就行,找优先级大的就找最右端,然

后把对应指针修改就行。所以其实BIT就行了。详见代码:

// file name: poj3481.cpp //
// author: kereo //
// create time:  2014年08月28日 星期四 18时52分59秒 //
//***********************************//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=1000000+100;
const int inf=0x3fffffff;
#define L(x) (x<<1)
#define R(x) (x<<1|1)
int n,top,cnt;
int st[MAXN];
struct node 
{int val,s;node *fa,*ch[2];
}nod[MAXN],nil,*root,*null;
map<int,int>mp;
struct Splay
{void init(){top=cnt=0;nil.s=nil.val=0; null=&nil;root=null;}void newnode(node *&x,node *f,int val){if(top) x=&nod[st[--top]];else x=&nod[cnt++];x->s=1; x->val=val; x->fa=f; x->ch[0]=x->ch[1]=null;}/*void push_up(node *x){x->s=1;if(x->ch[0]!=null) x->s+=x->ch[0]->s;if(x->ch[1]!=null) x->s+=x->ch[1]->s;}*/void rotate(node *x,int d){node *y=x->fa;//push_down(y); push_down(x);y->ch[d^1]=x->ch[d];if(x->ch[d]!=null) x->ch[d]->fa=y;x->fa=y->fa;if(y->fa!=null){int d1=y->fa->ch[0] == y ? 0 : 1;y->fa->ch[d1]=x;}x->ch[d]=y; y->fa=x;//push_up(y);}void splay(node *x,node *f){while(x->fa!=f){//push_down(x);node *y=x->fa;if(y->fa == f){int d=y->ch[0] == x ? 1 : 0;rotate(x,d);}else{int d=y->fa->ch[0] == y ? 1 : 0;if(y->ch[d] == x){ //之字型rotate(x,d^1); rotate(x,d);}else{ //一字型rotate(y,d); rotate(x,d);}}}//push_up(x);if(f == null) root=x;}void insert(node *&x,node *f,int val){if(x == null){newnode(x,f,val);//splay(x,null);return ;}int d=val< x->val ? 0 : 1;insert(x->ch[d],x,val);}void Delete(node *x){splay(x,null); st[top++]=x-nod;//printf("#####x->ch[0]->val=%d x->val=%d x->ch[1]->val=%d root->val=%d \n",x->ch[0]->val,x->val,x->ch[1]->val,root->val);if(x->ch[0] == null){//printf("haha1\n");if(x->ch[1] == null){root=null;}else{root=x->ch[1];x=x->ch[1];x->fa=null;}}else{//printf("haha2\n");node *y=x->ch[0];//printf("$$$$$$x->ch[0]->val = %d\n",y->val);while(y->ch[1]!=null) y=y->ch[1];splay(y,x);y->ch[1]=x->ch[1];if(x->ch[1]!=null)x->ch[1]->fa=y;y->fa=null; root=x=y;//push_up(y);}}//---------------------------------------------------------------//int get_prefix(node *x){if(x == null) return 0;//printf("(2)x->ch[0]->val=%d x->val=%d x->ch[1]->val=%d\n",x->ch[0]->val,x->val,x->ch[1]->val);node *par=x;while(x->ch[0]!=null) par=x,x=x->ch[0];//printf("(3) x->val=%d\n ",x->val);if(root == x) root=x->ch[1];par->ch[0]=x->ch[1];x->ch[1]->fa=par;int ans=x->val;//Delete(x);return ans;}int get_suffix(node *x){if(x == null) return 0;//printf("!!x->ch[0]->val=%d x->val=%d x->ch[1]->val=%d\n",x->ch[0]->val,x->val,x->ch[1]->val);node *par=x;while(x->ch[1]!=null) par=x,x=x->ch[1];if(root == x) root=x->ch[0];par->ch[1]=x->ch[0]; x->ch[0]->fa=par;int ans=x->val;//printf("!!!x->ch[0]->val=%d x->val=%d x->ch[1]->val=%d\n",x->ch[0]->val,x->val,x->ch[1]->val);//printf("******ans=%d\n",ans);//Delete(x);//printf("!!!x->ch[0]->val=%d x->val=%d x->ch[1]->val=%d\n",x->ch[0]->val,x->val,x->ch[1]->val);return ans;}
}spt;
int main()
{int cmd;spt.init(); mp.clear();mp[0]=0;while(~scanf("%d",&cmd) && cmd){if(cmd == 1){int k,p;scanf("%d%d",&k,&p);mp[p]=k;spt.insert(root,null,p);//spt.splay(x,null);//printf("root->ch[0]->val=%d root->val=%d root->ch[1]->val=%d\n",root->ch[0]->val,root->val,root->ch[1]->val);}if(cmd == 2){int ans=spt.get_suffix(root);//printf("root->ch[0]->val=%d root->val=%d root->ch[1]->val=%d\n",root->ch[0]->val,root->val,root->ch[1]->val);printf("%d\n",mp[ans]);}if(cmd == 3){//printf("(1)root->ch[0]->val=%d root->val=%d root->ch[1]->val=%d\n",root->ch[0]->val,root->val,root->ch[1]->val);int ans=spt.get_prefix(root);//printf("root->ch[0]->val=%d root->val=%d root->ch[1]->val=%d\n",root->ch[0]->val,root->val,root->ch[1]->val);printf("%d\n",mp[ans]);}}return 0;
}


这篇关于poj3481 Double Queue splay的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1059995

相关文章

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

ActiveMQ—Queue与Topic区别

Queue与Topic区别 转自:http://blog.csdn.net/qq_21033663/article/details/52458305 队列(Queue)和主题(Topic)是JMS支持的两种消息传递模型:         1、点对点(point-to-point,简称PTP)Queue消息传递模型:         通过该消息传递模型,一个应用程序(即消息生产者)可以

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

Java-数据结构-栈和队列-Stack和Queue (o゚▽゚)o

文本目录: ❄️一、栈(Stack):     ▶ 1、栈的概念:   ▶ 2、栈的使用和自实现:      ☑ 1)、Stack():       ☑ 2)、push(E e):      ☑ 3)、empty():         ☑ 4)、peek(E e):        ☑ 5)、pop(E e):       ☑ 6)、size(E e):  ▶ 3、栈自实现的总代

stack,queue, priority_queue

STL 中栈的使用方法(stack) #include <stack> 基本操作: push(x) 将x加入栈中,即入栈操作 pop() 出栈操作(删除栈顶),只是出栈,没有返回值 top() 返回第一个元素(栈顶元素) size() 返回栈中的元素个数 empty() 当栈为空时,返回 true STL 中队列的使用(queue) #i

HDU 1297 Children’s Queue

题目: http://acm.hdu.edu.cn/showproblem.php?pid=1297 题解: D[n]表示有n个人时,满足排队要求的个数。 分类讨论: 1.第n个人为男生时,满足排队要求的个数等于D[n-1]. 2.第n个人为女生时,第n-1个必为女生,才满足要求。 此处还要进行一次分类: a.前n-2个满足排队要求时,个数为D[n-2]. b.前n-2个不满足

Error: label vector and instance matrix must be double的解决方法

在使用uci下载的数据时,建模时出现这个错误的解决方法 首先现在UCI上面下载数据 然后右键另存为就行了。这样我们就从UCI里面下载到了训练数据 在matlab 点 导入数据,数据类型要记得选第二个, 如果选择最后一个table就会出现这个问题 最后附上代码 %%之前先import wine.date IMPORTED DATA 设为Numeric Matrix (数值矩

C++ STL-Queue容器概念及应用方法详解

1. 再谈队列 队列和栈不同,队列是一种先进先出的数据结构,STL的队列内容极其重要,虽然内容较少但是请务必掌握,STL的队列是快速构建搜索算法以及相关的数论图论的状态存储的基础。 概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口。 队列容器允许从一端新增元素,从另一端移除元素。队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历

ORA-24067: exceeded maximum number of subscribers for queue ADMIN.SMS_MT_QUEUE

临时处理办法: delete from aq$_ss_MT_tab_D;delete from aq$_ss_MT_tab_g;delete from aq$_ss_MT_tab_h;delete from aq$_ss_MT_tab_i;delete from aq$_ss_MT_tab_p;delete from aq$_ss_MT_tab_s;delete from aq$

Splay树(区间更新)—— POJ 3468 A Simple Problem with Integers

对应POJ 题目:点击打开链接 A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072KTotal Submissions: 72765 Accepted: 22465Case Time Limit: 2000MS Description You have N integers, A1