洛谷 P3391 文艺平衡树

2023-10-09 04:38
文章标签 平衡 洛谷 文艺 p3391

本文主要是介绍洛谷 P3391 文艺平衡树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1

输入输出格式

输入格式:

第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n) m表示翻转操作次数

接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n

输出格式:

输出一行n个数字,表示原始序列经过m次变换后的结果

输入输出样例

输入样例#1:
5 3
1 3
1 3
1 4
输出样例#1:
4 3 2 1 5

说明

N,M<=100000




又是一道模板题,怎么那么像线段树啊。

不过好像不太一样,至今不懂啥时候pushdown(想哭)。

#include<iostream>
#include<cstdio>
using namespace std;
const int N=100005;
int n,m,rt,fa[N],tag[N],ch[N][2],sz[N];
void pushup(int x)
{sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;
}
void pushdown(int x)
{tag[ch[x][0]]^=1;tag[ch[x][1]]^=1;swap(ch[x][0],ch[x][1]);tag[x]=0;
}
void rotate(int x,int &k)
{int y=fa[x],z=fa[y],lc,rc;if(ch[y][0]==x)lc=0;elselc=1;rc=lc^1;if(y==k)k=x;elsech[z][ch[z][1]==y]=x;fa[x]=z,fa[y]=x;fa[ch[x][rc]]=y;ch[y][lc]=ch[x][rc];ch[x][rc]=y;pushup(y),pushup(x);
}
void splay(int x,int &k)
{while(x!=k){int y=fa[x],z=fa[y];if(y!=k){if((ch[y][0]==x)^(ch[z][0]==y))rotate(x,k);elserotate(y,k);}rotate(x,k);}
}
int fnd(int x,int rnk)
{if(tag[x])pushdown(x);int lc=ch[x][0],rc=ch[x][1];if(sz[lc]+1==rnk)return x;if(sz[lc]>=rnk)return fnd(lc,rnk);return fnd(rc,rnk-sz[lc]-1);
}
void split(int l,int r)
{int x=fnd(rt,l),y=fnd(rt,r);splay(x,rt);splay(y,ch[x][1]);
}
void rev(int l,int r)
{split(l,r+2);int x=ch[ch[rt][1]][0];tag[x]^=1;
}
void build(int l,int r,int f)
{if(l>r)return ;if(l==r){fa[l]=f;sz[l]=1;ch[f][l>f]=l;return ;}int mid=(l+r)/2;build(l,mid-1,mid),build(mid+1,r,mid);fa[mid]=f;ch[f][mid>f]=mid;pushup(mid);
}
int main()
{scanf("%d%d",&n,&m);build(1,n+2,0);rt=(n+3)/2;while(m--){int l,r;scanf("%d%d",&l,&r);rev(l,r);}for(int i=2;i<=n+1;i++)printf("%d ",fnd(rt,i)-1);printf("\n");return 0;
}


这篇关于洛谷 P3391 文艺平衡树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/170399

相关文章

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

写给大数据开发:你真的“慢“了吗?揭秘技术与职场的平衡艺术

你是否曾经在深夜里,面对着一个棘手的数据处理问题,感到无比沮丧?或者在一次重要的项目汇报中,突然语塞,无法清晰地表达你的技术方案?作为一名大数据开发者,这些场景可能再熟悉不过。但别担心,因为你并不孤单。让我们一起探讨如何在这个瞬息万变的行业中,既磨练技术利刃,又培养职场软实力。 目录 技术与时间的赛跑1. 长远视角的重要性2. 复利效应在技能学习中的应用 跨界思维:数据结构教我们的职场智

代码随想录 -- 二叉树 -- 平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode) 思路:仍然是递归调用 1. 定义一个递归函数 count 用来计算二叉树的层数 2. isBalanced 函数:如果传入根节点为空返回真;如果根节点 | 左子树的层数 - 右子树的层数 | 大于1,返回假;最后返回根节点左子树、右子树是否是平衡二叉树。 class Solution(object):def count(self,root

构建STM32智能平衡车项目:PID控制算法与蓝牙通信技术

一、项目概述 项目目标和用途 本项目旨在设计和实现一款基于STM32单片机的平衡车。平衡车是一种新型的个人交通工具,广泛应用于短途出行、休闲娱乐等场景。通过本项目,我们希望能够实现一款具备良好稳定性和操控性的平衡车,能够在不同的地形上自如行驶。 解决的问题和带来的价值 平衡车的核心问题在于如何保持其平衡。传统的平衡车往往依赖于复杂的控制算法和高精度的传感器。通过本项目,我们将利用STM32

二叉搜索树、平衡二叉树、B树、B+树、B*树

二叉查找树 二叉查找树,由于不平衡,如果连续插入的数据是有顺序的、会导致如下图B的所示,此时搜索会退化到O(N)   二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么就是具有如下性质的二叉树: (1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3) 任

洛谷P5490扫描线

0是最小的数字,将一个线段看成一个区间,对于一个矩形,从下扫到上,入边为1,而出边为-1,意思是将这个区间上的所有点加1(区间修改).把线段表示为Line[i],其中记录了l,r,h,tag,左右端点,高度,入边还是出边(1或-1) 那么每次区间修改后不为0的区间它的值可能是1,2,3或者是其它数字,这不好统计,可以将它转化一下,0是不是表示没有被覆盖过的地方,我们只要统计0的个数然后用总长减去

【C++】【数据结构】一步一步写平衡二叉树[AVL]

转载:有修正,原作者存在一些错误,这里进行了更正。/* 平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体第一个引入平衡概念的二叉树。特点:对于每一个结点,它的左右子树的高度之差不能超过1,若插入或删除一个节点之后使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态。这个方案很好的解决的了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度

挤牛奶洛谷uasco

题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒。第二个农民在700秒开始,在 1200秒结束。第三个农民在1500秒开始2100秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。