luogu 模板 P3391 【模板】文艺平衡树(Splay)。

知识点:1.splay模板题,练习splay,rotate顺序:x变成z的儿子,x的一个儿子变为y的一个儿子(具体哪个看代码),y变为x的儿子。

    2.splay函数:如起码还需转两次,如最近两次旋转路径为直线,则先转x的父亲,再转x;如为折线,转两次x。

    3.insert函数:记得记录父亲节点,如果父亲存在还要让父亲连向被插入数x,记得新建节点,新建节点两个儿子设置为0,将siz数设为1。

#include <bits/stdc++.h>
using namespace std;
int n,m;
int cnt = 0;
struct edge
{
int ch[2];
int ff;
int siz;
int val;
int lazy;
}t[200002];
int rt = 0;
void pushup(int x)
{
//错误1:忘记加1(这个点本身),原为t[x].siz = t[t[x].ch[0]].siz + t[t[x].ch[1]].siz;
t[x].siz = t[t[x].ch[0]].siz + t[t[x].ch[1]].siz + 1;
}
void pushdown(int x)
{
if(t[x].lazy)
{
t[t[x].ch[0]].lazy^=1;
t[t[x].ch[1]].lazy^=1;
t[x].lazy=0;
swap(t[x].ch[0],t[x].ch[1]);
}
}
void rotate(int x)
{
int y = t[x].ff;
int z = t[y].ff;
int k = t[y].ch[1] == x;
t[z].ch[t[z].ch[1] == y] = x;
t[x].ff = z;
t[y].ch[k] = t[x].ch[k^1];
t[t[x].ch[k^1]].ff = y;
t[x].ch[k^1] = y;
t[y].ff = x;
pushup(y);
pushup(x);
}
void splay(int x,int goal)
{
while(t[x].ff != goal)
{
int y = t[x].ff,z = t[y].ff;
if(z != goal)
if((t[z].ch[1] == y)^(t[y].ch[1] == x))rotate(x);
else rotate(y);
rotate(x);
}
if(goal == 0)rt = x;
}
void insert(int x)
{
int u = rt,ff = 0;
while(u)
{
ff = u;
u = t[u].ch[t[u].val < x];
}
u = ++cnt;
if(ff)t[ff].ch[t[ff].val < x] = u;
t[u].val = x;
t[u].siz = 1;
t[u].ff = ff;
t[u].ch[0] = t[u].ch[1] = 0;
splay(u,0);
}
int Kth(int k)
{
int u = rt;
while(1)
{
//错误2:一开始把所有t[t[u].ch[0]].siz写成了t[u].siz,理解错误。
pushdown(u);
if(t[t[u].ch[0]].siz >= k)u = t[u].ch[0];
else if(t[t[u].ch[0]].siz + 1 == k)return u;
else k -= (t[t[u].ch[0]].siz + 1),u = t[u].ch[1];
} } void work(int l,int r)
{
int ls = Kth(l);
int rs = Kth(r + 2);
splay(ls,0);
splay(rs,ls);
t[t[t[rt].ch[1]].ch[0]].lazy ^= 1;
}
void print(int u)
{
pushdown(u);
if(t[u].ch[0])print(t[u].ch[0]);
if(t[u].val>1&&t[u].val<n+2)printf("%d ",t[u].val-1);
if(t[u].ch[1])print(t[u].ch[1]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= n + 2;i++)insert(i);//这里是因为要留出两个空节点,一头一尾,给1当前驱,给n当后继,而1变成2,2变成3.....n变成n + 1。
int l,r;
while(m--)
{
scanf("%d%d",&l,&r);
work(l,r);
}
print(rt);
return 0;
}

Splay 记录的更多相关文章

  1. 「算法笔记」Splay

    一.简介 Splay(伸展树)是平衡树中的一种.它通过不断将某个节点旋转到根节点的位置,使整棵树仍满足 BST 的性质,并且保持平衡而不至于退化为链. 频繁访问的节点会被移动到离根节点较近的位置,进而 ...

  2. GSS3 SPOJ 1716. Can you answer these queries III gss1的变形

    gss2调了一下午,至今还在wa... 我的做法是:对于询问按右区间排序,利用splay记录最右的位置.对于重复出现的,在splay中删掉之前出现的位置所在的节点,然后在splay中插入新的节点.对于 ...

  3. luogu P1486 [NOI2004]郁闷的出纳员

    一万年以后终于调过了这题 这道题主要是维护一个有序的集合(吧),所以使用平衡树(我这里用\(Splay\)) 记录一个变量\(ff\)(雾),表示所有工资的变化量 对于\(I\)操作,如果初始工资大于 ...

  4. [APIO2018] New Home

    题面在这里 description 在一个数轴上: 给定\(n\)个商店,每个商店有一个开业时间,关门时间,坐标和销售物品的种类 同时有\(m\)个询问,每个询问给你一个时间\(t[i]\)和地点\( ...

  5. bzoj4817 & loj2001 [Sdoi2017]树点涂色 LCT + 线段树

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4817 https://loj.ac/problem/2001 题解 可以发现这个题就是 bzo ...

  6. splay总结

    以此文纪念人生首次竞赛大选 这里主要讲一讲splay的区间操作,我讲的是指针实现,程序的效率可能比较低,更偏重代码的可读可写性,语言风格不是很优美有效,不喜勿喷 零.初始化结构体 1)这里主要是初始化 ...

  7. NOI 2002 营业额统计 (splay or fhq treap)

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

  8. bzoj 1503 splay

    因为是整体加减,所以直接记录在外面. #include<iostream> #include<cstdio> #include<cstring> #include& ...

  9. Splay伸展树学习笔记

    Splay伸展树 有篇Splay入门必看文章 —— CSDN链接 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 创造者:Daniel Sleator 和 Robert Ta ...

随机推荐

  1. 仅需1秒!搞定100万行数据:超强Python数据分析利器

    前言 使用Python进行大数据分析变得越来越流行.这一切都要从NumPy开始,它也是今天我们在推文介绍工具背后支持的模块之一. 2 Vaex Vaex是 一种更快.更安全.总体上更方便的方法,可以使 ...

  2. C语言学习笔记之函数指针与函数指针数组

    指针函数:本质是一个函数: 是一个返回指针类型的函数int * sum(){ } 函数指针:本质是一个指针: 是一个指向函数的指针 int (*p)(int,int) = sum; p(5,6); i ...

  3. JS 节点笔记

    h5新增自定义属性     为了保存并使用数据,有一些数据不必要保存到数据库中:     data开头作为自定义属性并赋值     兼容性获取element.getAttribute("da ...

  4. Markdown上手

    Markdown 学习日记 标题 二级标题 两个#+空格 快捷键:Ctrl + 2 三级标题 三个#+空格 快捷键:Ctrl + 3 最多支持六级标题 字体 加粗 文字 两个 *+文字+两个 * 快捷 ...

  5. Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现

    Spring中事务的使用示例.属性及使用中可能出现的问题 前言 本专题大纲如下: 对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细,本来是想在源码分析的文章中附带讲一讲事务使用中的 ...

  6. JS学习第九天

    DOM创建表格: insertRow(index) 在指定索引位置插入一行 deleteRow(index) 删除表格中index索引处的行 insertCell(index) 在index处创建一个 ...

  7. C#LeetCode刷题之#217-存在重复元素(Contains Duplicate)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3772 访问. 给定一个整数数组,判断是否存在重复元素. 如果任何 ...

  8. LeetCode406 queue-reconstruction-by-height详解

    题目详情 假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列. 注意: 总人数少于 ...

  9. FCOS: Fully Convolutional One-Stage Object Detection

    论文:FCOS: Fully Convolutional One-Stage Object Detection   目录 0.简介 1.网络结构 2.框回归--直接.自由 3.Center-ness ...

  10. Mybatis 和 Solon 在一起的升级版

    终于说通 Solon 作者,让他为 Solon 框架添加事务注解支持了:并且把 mybatis-solon-plugin 的 @Df 注解更名为 @Db ,接地气多了(Df是什么鬼呢?新手肯定这么想. ...