【Splay】文艺平衡树(金牌导航 Splay-2)

#文艺平衡树

金牌导航 Splay-2

题目大意

给你一个1~n的序列,然后对序列的区间做若干次翻转,问你最后的序列

输入样例

5 3
1 3
1 3
1 4

输出样例

4 3 2 1 5

数据范围

1⩽n,m⩽105,1⩽l⩽r⩽n1\leqslant n,m\leqslant 10^5,1\leqslant l\leqslant r \leqslant n1n,m105,1lrn

解题思路

对于该序列,可以用Splay来存储(直接存数字)
对于翻转区间,在中序遍历中,原顺序是左中右,翻转后为右中左,相当于把区间内所有节点的左右子树交换,这里可以用标记记下,当用到时再下传(形如线段树的lazy)
对于选取的区间,可以将序列旋转成如下状态,此时就可以直接得到所选区间的子树
在这里插入图片描述

最后直接按顺序输出即可

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 100010
#define MAXN 200000
using namespace std;
int n, m, x, y, w, rt, a[N], s[N], p[N], ls[N], rs[N], sz[N], fa[N];
int ss(int x)
{return x == ls[fa[x]];
}
void down(int x)//标记下传
{if (x && p[x]){p[ls[x]] ^= 1;p[rs[x]] ^= 1;swap(ls[x], rs[x]);p[x] = 0;}
}
void up(int x)//计算节点个数
{sz[x] = sz[ls[x]] + sz[rs[x]] + 1;
}
void take_up(int x)//向上移动
{int y = fa[x], z = fa[y];down(y);down(x);int g = ss(x)? rs[x]: ls[x];if (z) ss(y)? ls[z] = x: rs[z] = x;if (ss(x)) rs[x] = y, ls[y] = g;else ls[x] = y, rs[y] = g;if (g) fa[g] = y;fa[y] = x;fa[x] = z;up(y);up(x);
}
void Splay(int x, int y)
{while(fa[x] != y){if (fa[fa[x]] != y)ss(x) == ss(fa[x])? take_up(fa[x]): take_up(x);take_up(x);}if (!y) rt = x;
}
int find(int v)//查找目标节点
{int x = rt;while(x){down(x);if (v <= sz[ls[x]]) x = ls[x];else{v -= sz[ls[x]] + 1;if (!v) return x;x = rs[x];}}
}
int build(int lst, int l, int r)//建树
{if (l > r) return 0;int x = ++w, mid = (l + r) >> 1;s[x] = a[mid];p[x] = 0;fa[x] = lst;ls[x] = build(x, l, mid - 1);rs[x] = build(x, mid + 1, r);up(x);return x;
}
void write(int x)
{down(x);if (ls[x]) write(ls[x]);//按中序遍历if (s[x] != -MAXN && s[x] != MAXN)printf("%d ", s[x]);if (rs[x]) write(rs[x]);
}
int main()
{scanf("%d%d", &n, &m);a[1] = -MAXN;a[n + 2] = MAXN;for (int i = 2; i <= n + 1; ++i)a[i] = i - 1;rt = build(0, 1, n + 2);while(m--){scanf("%d%d", &x, &y);x = find(x);y = find(y + 2);Splay(x, 0);Splay(y, x);p[ls[rs[rt]]] ^= 1;}write(rt);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现

前言本篇会继续讲解Sikiro.SMS.Job服务的实现&#xff0c;在我写第一篇的时候&#xff0c;我就发现我当时设计的架构里Sikiro.SMS.Job这个可以选择不需要&#xff0c;而使用MQ代替。但是为了说明调度任务使用实现也坚持写了下。后面会一篇针对架构、实现优化的讲解。源码地址&a…

Drainage Ditches POJ1273

Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 93263 Accepted: 36174试题链接 文章目录Description题意&#xff1a;题解&#xff1a;代码&#xff1a;Dinic做法EK做法Description Every time it rains on Farmer John’s fields, a pond forms over Bessie’…

P2756 飞行员配对方案问题【网络流24题】

P2756 飞行员配对方案问题 文章目录题目背景题解&#xff1a;代码&#xff1a;题目背景 第二次世界大战期间&#xff0c;英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的两名飞行员&#xff0c;其中一名是英国…

大数据分析中使用关系型数据库的关键点

相当一部分大数据分析处理的原始数据来自关系型数据库&#xff0c;处理结果也存放在关系型数据库中。原因在于超过99%的软件系统采用传统的关系型数据库&#xff0c;大家对它们很熟悉&#xff0c;用起来得心应手。在我们正式的大数据团队&#xff0c;数仓&#xff08;数据仓库H…

图论复习——最小生成树MST

知识点 MST的构造 Boruvka算法常用于解决这类问题&#xff1a;给你n个点&#xff0c;每个点有点权&#xff0c;任意两个点之间有边权&#xff0c;边权为两个点权用过某种计算方式得出&#xff0c;求最小生成树。动图 MST上的确定性和存在性问题 最小生成树的两个性质&#xf…

Ocelot简易教程(二)之快速开始1

Ocelot是为.net core量身定做的&#xff0c;目前是基于 netstandard2.0进行构建的。.NET Core 2.1中如何使用呢&#xff1f;安装NuGet package使用nuget安装Ocelot及其依赖项。您需要创建一个netstandard2.0项目并将其Package安装到项目中。然后按照下面的“启动”和“ 配置”节…

P2761 软件补丁问题

文章目录题目描述题解&#xff1a;代码&#xff1a;添加链接描述题目描述 T 公司发现其研制的一个软件中有 n 个错误&#xff0c;随即为该软件发放了一批共 m 个补丁程序。每一个补丁程序都有其特定的适用环境&#xff0c;某个补丁只有在软件中包含某些错误而同时又不包含另一些…

Xamarin中国技术社区及BXUG官网上线啦

Xamarin中国技术社区及BXUG官网为.NET开发者提供移动跨平台技术学习的园地&#xff0c;为Xamarin及.NET技术达人提供展示分享的舞台&#xff0c; 为企业CTO等技术负责人提供跨平台移动应用解决方案的交流平台&#xff01;网址链接&#xff1a;http://bxug.bopoda.cn/Xamarin中国…

用python将图片转换成二值图像

大创项目是图像识别&#xff0c;第一个任务是将一个图片转换成二值图像 之前用过python的numpy和turtle&#xff0c;这次要用到图像库PIL的类Image&#xff0c;也算是刚刚从零开始学起 整体效果&#xff08;用01串表示图像&#xff09; 原理很简单&#xff1a;将图片中黑色…

.Net Core SignalR 初体验

前言Asp.Net SignalR已经出来很久了&#xff0c;但是一直没有静下心来好好看看。昨天花了几个小时的时间看了下。首先借鉴了官方文档&#xff0c;如何搭建一个SignalR的Demo。参考文章&#xff1a;https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?viewaspnet…

CF1251F-Red-White Fence【NTT】

前言 刚开始看错题推了半天的生成函数 正题 题目链接:https://www.luogu.com.cn/problem/CF1251F 题目大意 nnn个白色木板&#xff0c;kkk个红色木板&#xff0c;给出这些木板的高度&#xff0c;木板排成一排形成栅栏。栅栏要求只有一个红色木板且在红色木板左边单调升&…

图论复习——dfs树,点双,边双,强连通分量

知识点 dfs树 对一个图运行 dfs 算法&#xff0c;每个点uuu的父亲定义为第一次遍历uuu时的前驱结点&#xff0c;若无则为根。 无向图的 dfs树 没有横叉边。 有向图的 dfs树 横叉边方向唯一&#xff0c;总是从后访问的点指向先访问的点。 dfs树详解 tarjan 点双 定义&#…

【点分治】Tree(luogu 4178/金牌导航 点分治-1)

Tree luogu 4178 金牌导航 点分治-1 题目大意 给出一棵树&#xff0c;问你书中路径长度小于等于k的点对个数有多少个 输入样例 5 1 2 3 1 3 1 1 4 2 3 5 1 4输出样例 8数据范围 1⩽N⩽41041\leqslant N \leqslant 4\times 10^41⩽N⩽4104 解题思路 对于该树&#xff0…

均分纸牌问题

均分纸牌有三种情况&#xff1a;线性&#xff0c;环形&#xff0c;二维 文章目录线性题目描述思路&#xff1a;代码&#xff1a;环形题目描述思路代码线性 题目描述 P1031 均分纸牌 有N堆纸牌&#xff0c;编号分别为1,2,…,N。每堆上有若干张&#xff0c;但纸牌总数必为N的倍…

.net core实践系列之短信服务-Api的SDK的实现与测试

前言上一篇《.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现》讲解了API的设计与实现&#xff0c;本篇主要讲解编写接口的SDK编写还有API的测试。或许有些人会认为&#xff0c;SDK的编写可以不需要&#xff0c;既然已经用了RESTful web服务与Swagger提供的接口描述&…

[集训队作业2018] count(笛卡尔树,生成函数,卡特兰数)

传送门 什么情况下两序列同构 对于两序列A[1,n],B[1,n]A[1,n],B[1,n]A[1,n],B[1,n]&#xff0c;设fA(1,n)pa,fB(1,n)pbf_A(1,n)p_a,f_B(1,n)p_bfA​(1,n)pa​,fB​(1,n)pb​&#xff0c; 若pa̸pbp_a\notp_bpa​​pb​&#xff0c;A,BA,BA,B一定不同构。若papbp_ap_bpa​p…

P4016 负载平衡问题

文章目录题目描述题解&#xff1a;方法一&#xff1a;代码&#xff1a;方法二&#xff1a;P4016 负载平衡问题题目描述 G 公司有 n 个沿铁路运输线环形排列的仓库&#xff0c;每个仓库存储的货物数量不等。如何用最少搬运量可以使 n 个仓库的库存数量相同。搬运货物时&#xff…

Ocelot简易教程(二)之快速开始2

为什么这篇的标题叫“Ocelot简易教程&#xff08;二&#xff09;之快速开始2”呢&#xff0c;因为很多朋友跟我说上一篇“ Ocelot简易教程&#xff08;二&#xff09;之快速开始1”内容太少了&#xff0c;只是简单介绍Ocelot的一些简单配置&#xff0c;让Ocelot能跑起来&#x…

.NET的前世今生与将来

笔者注谨以此文纪念我敬重的2016年9月17日去世的 装配脑袋 逝世两周年让大家久等了&#xff0c;前后花了1年的时间&#xff0c;几经改版&#xff0c;终于完成撰写了一万字长文&#xff0c;回顾和展望.NET这16年来的成功与失败。最终能成文是因为我给自己承诺必须赶在 装配脑袋 …

P4011 孤岛营救问题

P4011 孤岛营救问题 文章目录输入输出样例题意&#xff1a;题解&#xff1a;代码&#xff1a;输入输出样例 输入 4 4 9 9 1 2 1 3 2 1 2 2 2 0 2 1 2 2 0 2 1 3 1 0 2 3 3 3 0 2 4 3 4 1 3 2 3 3 0 3 3 4 3 0 4 3 4 4 0 2 2 1 2 4 2 1输出 14题意&#xff1a; (原题太长我就…