题目链接:点击打开链接

题意:

给定n个人来排队

每一个人有2个參数。身份优先级和脸皮厚度 ==

来的那个人会排到队尾

假设这个人的优先级比他前面那个人的优先级大就会和前面那个人交换位置。

交换一次脸皮厚度减1, 一直交换到队头或者脸皮厚度为0

交换完毕后下一个人才会到来。

问:

队伍最后的情况(从队头到队尾依次输出每一个人的编号)

思路:splay

维护子树的最小值。

插入时递归插入,若当前点是空就插这个位置。

然后就是裸的splay。。

==

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <queue>
#include <functional>
#include <map>
#include <iostream>
#include <set>
using namespace std;
typedef pair<int,int> pii;
#define ll int
#define inf 1000000
#define N 100005
#define L(x) tree[x].ch[0]
#define R(x) tree[x].ch[1]
#define Size(x) tree[x].siz
#define Val(x) tree[x].val
#define Father(x) tree[x].fa
#define Max(x) tree[x].max
struct node{
int ch[2], siz, fa;
int val, max; //伸展树里存的是队列的顺序
}tree[N];
int tot, root;
void Newnode(int &id, int fa, int val, int siz = 1){
node E={0,0,siz,fa,val,val};
id = tot++;
tree[id] = E;
}
void push_down(int id){}
void push_up(int id){
Size(id) = Size(L(id)) + Size(R(id)) + 1;
Max(id) = max( max(Max(L(id)), Max(R(id))), Val(id));
}
void Rotate(int id, int kind){
int y = Father(id);
push_down(y); push_down(id);
tree[y].ch[kind^1] = tree[id].ch[kind];
Father(tree[id].ch[kind]) = y;
if(Father(y))
tree[Father(y)].ch[R(Father(y))==y] = id;
Father(id) = Father(y);
Father(y) = id;
tree[id].ch[kind] = y;
push_up(y);
}
void Splay(int id, int goal){
push_down(id);
while(Father(id) != goal)
{
int y = Father(id);
if(Father(y) == goal)
Rotate(id, L(y) == id);
else
{
int kind = L(Father(y)) == y;
if(tree[y].ch[kind]==id)
{
Rotate(id, kind^1);
Rotate(id, kind);
}
else
{
Rotate(y, kind);
Rotate(id, kind);
}
}
}
push_up(id);
if(goal == 0)root = id;
}
void Insert(int &id, int val, int siz, int father){ //把值为val的点插到goal点后面
if(id == 0) {
Newnode(id, father, val);
return ;
}
if(val < Max(R(id)) || val < Val(id) || siz < Size(R(id)))
Insert(R(id), val, siz, id);
else
Insert(L(id), val, siz-Size(R(id))-1, id);
push_up(id);
} void init(){
//初始化0这个点
Father(0) = L(0) = R(0) = Size(0) = 0;
Val(0) = 0;
//默认1为最左端点
tot = 1;
Newnode(root, 0, inf);
Newnode(R(root), root, -1);
push_up(root);
}
map<int,int>mp; void put(ll id){
if(L(id))
put(L(id));
if(id > 2)
printf("%d ",mp[Val(id)]);
if(R(id))
put(R(id));
}
int main(){
ll i, u, v, n, id;
while(cin>>n){
mp.clear();
init();
for(i = 1; i <= n; i++) {
scanf("%d %d", &u, &v);
Insert(root, u, v, 0);
Splay(tot-1, 0);
mp[u] = i;
}
put(root); puts("");
}
return 0;
}
/*
2
1 0
2 1 3
1 3
2 3
3 3 5
2 3
1 4
4 3
3 1
5 2 1
1 0 4
4 1
2 2
1 3
3 2 4
4 1
2 2
1 3
3 1 4
4 1
2 2
1 3
3 0 4
1 0
2 1
3 2
4 3 4
1 0
2 1
4 2
3 3 5
1 0
2 1
4 2
3 3
5 2 6
1 0
2 1
4 2
3 3
5 2
6 4 7
2 2
3 4
5 1
7 2
6 5
1 0
4 1 ans:
1 4 2 3
1 2 4 3
1 2 3 4
4 3 2 1
3 4 2 1
3 4 5 2 1
3 6 4 5 2 1
2 4 5 3 1 7 6 */

Codeforces 38G Queue 伸展树的更多相关文章

  1. codeforces 38G - Queue splay伸展树

    题目 https://codeforces.com/problemset/problem/38/G 题意: 一些人按顺序进入队列,每个人有两个属性,地位$A$和能力$C$ 每个人进入时都在队尾,并最多 ...

  2. CodeForces 91B Queue (线段树,区间最值)

    http://codeforces.com/problemset/problem/91/B B. Queue time limit per test: 2 seconds memory limit p ...

  3. Codeforces 675D Tree Construction Splay伸展树

    链接:https://codeforces.com/problemset/problem/675/D 题意: 给一个二叉搜索树,一开始为空,不断插入数字,每次插入之后,询问他的父亲节点的权值 题解: ...

  4. 【BBST 之伸展树 (Splay Tree)】

    最近“hiho一下”出了平衡树专题,这周的Splay一直出现RE,应该删除操作指针没处理好,还没找出原因. 不过其他操作运行正常,尝试用它写了一道之前用set做的平衡树的题http://codefor ...

  5. POJ 3580 (伸展树)

    题目链接: http://poj.org/problem?id=3580 题目大意:对一个序列进行以下六种操作.输出MIN操作的结果. 解题思路: 六个操作,完美诠释了伸展树有多么吊.注意,默认使用L ...

  6. 二叉查找树,AVL树,伸展树【CH4601普通平衡树】

    最近数据结构刚好看到了伸展树,在想这个东西有什么应用,于是顺便学习一下. 二叉查找树(BST),对于树上的任意一个节点,节点的左子树上的关键字都小于这个节点的关键字,节点的右子树上的关键字都大于这个节 ...

  7. HYSBZ 1500 维修数列(伸展树模板)

    题意: 题解:典型伸展树的题,比较全面. 我理解的伸展树: 1 伸展操作:就是旋转,因为我们只需保证二叉树中序遍历的结果不变,所以我们可以旋转来保持树的平衡,且旋转有左旋与右旋.通过这种方式保证不会让 ...

  8. wikioi 1396 伸展树(两个模板)

    题目描写叙述 Description Tiger近期被公司升任为营业部经理.他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来 ...

  9. HDU 2475 Box 树型转线型 + 伸展树

    树型转线型.第一次听说这个概念. . . , 可是曾经已经接触过了,如LCA的预处理部分和树链剖分等.可是没想到还能这么用,三者虽说有不同可是大体思想还是非常相近的,学习了. 推荐博客http://b ...

随机推荐

  1. [POI2015]Kinoman

    题目大意: 给你一个长度为n的数列f,f中共有m种不同的数,每种数都有一个权值w[i]. 你可以选定一个f中的区间,定义区间的权值为这一区间只出现一次的数的权值和. 问权值最大的区间的权值是多少? 思 ...

  2. 用swift开发自己的MacOS锁屏软件(二)

    上一篇中尝试写了hello world,这一篇中,开始尝试锁屏功能 1.尝试查找swift有没有相关的函数,可以控制系统锁屏之类的,结果并没有找到 2.尝试查找cocoa有没有相关的接口,结果仍然没有 ...

  3. 解决Eclipse 变量名的自动补全问题

    大家使用eclipse敲代码的时候,是不是都被这样一个问题困扰着.就是键入一个变量名的时候,会自动提示补全:在你的变量名后面加上类型的名字!这个时候,你就必须键入Esc才不会自动补全你的变量,如果你键 ...

  4. 关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-使用工厂创建代理(Using the ProxyFactoryObject to create AOP proxies)

    本文翻译自Spring.NET官方文档Version 1.3.2. 受限于个人知识水平,有些地方翻译可能不准确,但是我还是希望我的这些微薄的努力能为他人提供帮助. 侵删. 如果你正在为你的业务模型使用 ...

  5. canvas实现"雷达扫描"效果

    今天来讲解“雷达扫描”效果demo,来源于QQ群里边有群友说想要个雷达效果,就尝试写了一下. 效果图: demo链接: https://win7killer.github.io/can_demo/de ...

  6. ASIHTTPRequest学习(四)

    如果是IOS5的版本,可能集成过程中会遇到一些问题,我也找到了一些解决方案,比如,集成完后可能会遇到编译提示找不到"libxml/HTMLparser.h",解决这个问题可以参考这 ...

  7. Makefile文件的使用

    编译程序: vi Makefile exe:a.c b.c gcc a.c b.c -o exe clean: rm exe 保存并退出: 这里exe:a.c b.c面的exe称为目标:a.c b.c ...

  8. GlusterFS分布式文件系统部署

    GlusterFS是一个可伸缩的网络文件系统,使用常见的现成的硬件,您可以创建大型分布式存储流媒体解决方案.数据分析.和其他数据相关的任务.GlusterFS是自由和开源软件. 详细参考官网:http ...

  9. 《Qt on Android核心编程》相关资源

    有不少朋友反馈在搭建 Qt on Android 开发环境时遇到了问题,诸如 Android SDK 无法下载. jdk 找不到合适的版本号.创建 AVD 出错等等.为此我把与<Qt on An ...

  10. 基于WPF系统框架设计(2)-Fluent Ribbon之HelloWorld

    Fluent/Ribbon是微软在其最新桌面操作系统Windows 7中使用的图形用户界面. Windows平台的进化,伴随着系统图形界面的重新设计.从Windows XP到Windows Vista ...