codeforces 38G - Queue splay伸展树
题目
https://codeforces.com/problemset/problem/38/G
题意:
一些人按顺序进入队列,每个人有两个属性,地位$A$和能力$C$
每个人进入时都在队尾,并最多可以和前一位互换$C$次,如果前一位的地位高于自己,则无法继续互换.
最终一次性输出整个队列
题解:
splay维护动态的队列
可以用类似权值线段树的思维去考虑
对于每个点,保存其子节点的最大值,自身的值,与子树的大小
对于每次插入时,若能跨过整颗右子树与当前节点,则向左走,否则向右
可以保证整个子树中序遍历的顺序即为当前队列
又因为是平衡树,每次插入一个点,都将该点旋转至根,因此均摊复杂度$O(logn)$
#include <bits/stdc++.h>
#define endl '\n'
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
using namespace std;
const int maxn=1e6+10,maxm=2e6+10;
const int INF=0x3f3f3f3f;
int casn,n,m,k;
class splaytree{
#define nd node[now]
#define ndl node[node[now].son[0]]
#define ndr node[node[now].son[1]]
public:
struct splaynode{
int son[2],pre;
int val,mx,size;
splaynode(){mx=val=size=pre=son[0]=son[1]=0;}
splaynode(int x,int fa=0){mx=val=x;pre=fa;son[0]=son[1]=0;size=1;}
};
int cnt,root;
vector<splaynode> node;
void pushup(int now){
nd.mx=nd.val,nd.size=1;
rep(i,0,1)if(nd.son[i]) {
nd.mx=max(node[nd.son[i]].mx,nd.mx);
nd.size+=node[nd.son[i]].size;
}
}
void pushdown(int now){}
void rotate(int now,int d){
int fa=nd.pre;
pushdown(fa);pushdown(now);
node[fa].son[!d]=nd.son[d];
node[nd.son[d]].pre=fa;
if(node[fa].pre){
node[node[fa].pre].son[node[node[fa].pre].son[1]==fa]=now;
}else root=now;
nd.pre=node[fa].pre;
nd.son[d]=fa,node[fa].pre=now;
pushup(fa);pushup(now);
}
void splay(int now,int dst){
pushdown(now);
while(nd.pre!=dst){
if(node[nd.pre].pre==dst)rotate(now,node[nd.pre].son[0]==now);
else{
int fa=nd.pre,d=(node[node[fa].pre].son[0]==fa);
if(node[fa].son[d]==now){rotate(now,!d);rotate(now,d);}
else {rotate(fa,d);rotate(now,d);}
}
}
if(!dst) root=now;
pushup(now);
}
void insert(int val,int len){
if(!root){
node[++cnt]=splaynode(val);
root=cnt;
return;
}
int now=root;
int flag=(val<(max(nd.val,ndr.mx))||len<ndr.size+1);
while(1){
if(!nd.son[flag]){
node[++cnt]=splaynode(val,now);
nd.son[flag]=cnt;
break;
}
if(!flag)len-=ndr.size+1;
now=nd.son[flag];
flag=(val<(max(nd.val,ndr.mx))||len<ndr.size+1);
}
pushup(now);
splay(cnt,0);
}
void print(){print(root);}
void print(int now){
if(nd.son[0]) print(nd.son[0]);
cout<<now<<' ';
if(nd.son[1]) print(nd.son[1]);
}
splaytree(int n){
node.resize(n+7);
root=0,cnt=0;
}
};
int main() {
IO;
cin>>n;
splaytree tree(n);
rep(i,1,n){
int a,b;cin>>a>>b;
tree.insert(a,b);
}
tree.print();
return 0;
}
codeforces 38G - Queue splay伸展树的更多相关文章
- Splay伸展树学习笔记
Splay伸展树 有篇Splay入门必看文章 —— CSDN链接 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 创造者:Daniel Sleator 和 Robert Ta ...
- 【学时总结】◆学时·VI◆ SPLAY伸展树
◆学时·VI◆ SPLAY伸展树 平衡树之多,学之不尽也…… ◇算法概述 二叉排序树的一种,自动平衡,由 Tarjan 提出并实现.得名于特有的 Splay 操作. Splay操作:将节点u通过单旋. ...
- Codeforces 675D Tree Construction Splay伸展树
链接:https://codeforces.com/problemset/problem/675/D 题意: 给一个二叉搜索树,一开始为空,不断插入数字,每次插入之后,询问他的父亲节点的权值 题解: ...
- Splay 伸展树
废话不说,有篇论文可供参考:杨思雨:<伸展树的基本操作与应用> Splay的好处可以快速分裂和合并. ===============================14.07.26更新== ...
- [Splay伸展树]splay树入门级教程
首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角.. 首先引入一下splay的概念,他的中文名是伸展树,意思差不多就是可以随意翻转的二叉树 PS:百度百科中伸展树读作:BoGa ...
- Splay伸展树入门(单点操作,区间维护)附例题模板
Pps:终于学会了伸展树的区间操作,做一个完整的总结,总结一下自己的伸展树的单点操作和区间维护,顺便给未来的自己总结复习用. splay是一种平衡树,[平均]操作复杂度O(nlogn).首先平衡树先是 ...
- UVA 11922 Permutation Transformer —— splay伸展树
题意:根据m条指令改变排列1 2 3 4 … n ,每条指令(a, b)表示取出第a~b个元素,反转后添加到排列尾部 分析:用一个可分裂合并的序列来表示整个序列,截取一段可以用两次分裂一次合并实现,粘 ...
- [算法] 数据结构 splay(伸展树)解析
前言 splay学了已经很久了,只不过一直没有总结,鸽了好久来写一篇总结. 先介绍 splay:亦称伸展树,为二叉搜索树的一种,部分操作能在 \(O( \log n)\) 内完成,如插入.查找.删除. ...
- Codeforces 38G Queue 伸展树
题目链接:点击打开链接 题意: 给定n个人来排队 每一个人有2个參数.身份优先级和脸皮厚度 == 来的那个人会排到队尾 假设这个人的优先级比他前面那个人的优先级大就会和前面那个人交换位置. 交换一次脸 ...
随机推荐
- golang redis连接池使用方法
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) var pool *redis ...
- 2016vijos 6-1 松鼠聚会(LCA+卡空间)
求LCA,N=1e6,原空间限制8MB 求LCA需要深度,需要跳跃一定距离的祖先,需要父节点 把一个整数压成3个char,f[]存父节点 g[],深度为奇数的点存往上跳576步能到的点,深度为偶数的点 ...
- 细说java系统之动态代理
代理模式 在深入学习动态代理之前,需要先掌握代理模式.只有深刻理解了代理模式的应用,才能充分理解Java动态代理带来的便利. 在生活中存在许多使用"代理模式"的场景,比如:村里的张 ...
- 关于REST API设计的文章整理
1. rest api uri设计的7个准则(1)uri末尾不需要出现斜杠/(2)在uri中使用斜杠/表达层级关系(3)在uri中可以使用连接符-提升可读性(4)在uri中不允许出现下划线字符_(5) ...
- vue cli 解决跨域 线上 nginx 反向代理配置
前后分离 axios 接 api 跨域问题如图: 解决办法: 1. npm start 本地开发环境解决: 在webpack配置文件 /config/index.js 里找到 proxyTable 开 ...
- Win10 64位连接LJM1005打印机局域网访问
除了网上常见的开Guest用户之类需要额外三个设置 (1)安装LJM1005驱动LJM1005_Full_Solution (2)设置打印机共享和安全中的everyone全部勾选(解决能看到打印机无法 ...
- Your accoutn already has a valid IOS Distribution certificate
这个问题是IOS证书不对,登录Apple开发中心,清空所有证书,然后再Archive->Reset.
- mysql字符函数
1.CONCAT() 字符连接 (1)mysql> SELECT CONCAT('imooc', 'MYSQL');+--------------------------+| CONCAT(' ...
- pycharm活动模板
1.复制模板内容 2.文件设置: 点击+号:
- luogu P2470 [SCOI2007]压缩
传送门 dalao们怎么状态都设的两维以上啊?qwq 完全可以一维状态的说 设\(f[i]\)为前缀i的答案,转移就枚举从前面哪里转移过来\(f[i]=min(f[j-1]+w(j,i))(j\in ...