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. 商品描述(动画)--- jQuery

    本文章实现是基于jQuery展示商品描述的一个功能 (1)鼠标移入显示描述内容,鼠标移开内容隐藏.先来看看一个先后效果. (2)jQuery所以的文件可以自行下载,也可以在我主页找到文件,右键文件名复 ...

  2. java 访问修饰符与代码块

    一 访问修饰符 要想本包中的类都可以访问不加修饰符即可:  要想仅能在本类中访问使用private修饰: 要想本包中的类与其他包中的子类可以访问使用protected修饰 要想所有包中的所有类都可以访 ...

  3. C#设计模式之8-组合模式

    组合模式(Composite Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/403 访问. 组合模式属 ...

  4. Linux系统安装Nginx(Centos7)

    Nginx是一款轻量级的网页服务器.反向代理服务器.它最常的用途是提供反向代理服务,还可以做负载均衡.相较于Apache.lighttpd具有占有内存少,稳定性高等优势.服务端很多场景都需要使用,这篇 ...

  5. 基于Linux系统geth的安装

    转载地址 https://blog.csdn.net/qq_36124194/article/details/83658580 基于Linux系统geth的安装 安装ethereum sudo apt ...

  6. python设计模式之外观模式

    python设计模式之外观模式 系统会随着演化变得非常复杂,最终形成大量的(并且有时是令人迷惑的)类和交互,这种情况并不少见.许多情况下,我们并不想把这种复杂性暴露给客户端.外观设计模式有助于隐藏系统 ...

  7. CopyOnWriteArrayList源码阅读笔记

    简介 ArrayList是开发中使用比较多的集合,它不是线程安全的,CopyOnWriteArrayList就是线程安全版本的ArrayList.CopyOnWriteArrayList同样是通过数组 ...

  8. python基础 Day11

    python Day11 函数中默认参数的陷阱 只针对默认参数是可变的数据类型(如果你的默认参数指向的是可变的数据类型,那么你无论调用多少次默认参数,都是同一个) def test(name,list ...

  9. SparkStreaming支持的业务场景

    目前而言SparkStreaming 主要支持以下三种业务场景: ➢ 无状态操作:只关注当前的DStream中的实时数据.例如:只对当前DStream中的数据做正确性校验.(下一条与上一条数据无关) ...

  10. echars 饼图使用

    option = {       tooltip: {         trigger: 'item',         formatter: '{a} <br/>{b}: {c} ({d ...