热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【模板】文艺平衡树(Splay)区间翻转BZOJ3223

您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,

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



N,M<&#61;100000

Sample Output4 3 2 1 5 Hint


Input

第一行为n,m n表示初始序列有n个数&#xff0c;这个序列依次是(1,2……n-1,n)  m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证 1<&#61;l<&#61;r<&#61;n 

Output

 

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

Sample Input5 3 1 3 1 3 1 4
Splay Tree &#xff0c;和上道题一样&#xff0c;我们的kth 返回的序列的第k个数&#xff1b;
然后中序遍历即可得到我们翻转后的序列&#xff1b;

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#pragma GCC optimize(2)
//#include
//#pragma GCC optimize("O3")
using namespace std;
#define maxn 100005
#define inf 0x3f3f3f3f
#define INF 9999999999
#define rdint(x) scanf("%d",&x)
#define rdllt(x) scanf("%lld",&x)
#define rdult(x) scanf("%lu",&x)
#define rdlf(x) scanf("%lf",&x)
#define rdstr(x) scanf("%s",x)
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int U;
#define ms(x) memset((x),0,sizeof(x))
const long long int mod &#61; 1e9 &#43; 7;
#define Mod 1000000000
#define sq(x) (x)*(x)
#define eps 1e-3
typedef pair pii;
#define pi acos(-1.0)
//const int N &#61; 1005;
#define REP(i,n) for(int i&#61;0;i<(n);i&#43;&#43;)inline ll rd() {ll x &#61; 0;char c &#61; getchar();bool f &#61; false;while (!isdigit(c)) {if (c &#61;&#61; &#39;-&#39;) f &#61; true;c &#61; getchar();}while (isdigit(c)) {x &#61; (x <<1) &#43; (x <<3) &#43; (c ^ 48);c &#61; getchar();}return f ? -x : x;
}ll gcd(ll a, ll b) {return b &#61;&#61; 0 ? a : gcd(b, a%b);
}
ll sqr(ll x) { return x * x; }/*ll ans;
ll exgcd(ll a, ll b, ll &x, ll &y) {if (!b) {x &#61; 1; y &#61; 0; return a;}ans &#61; exgcd(b, a%b, x, y);ll t &#61; x; x &#61; y; y &#61; t - a / b * y;return ans;
}
*/ll qpow(ll a, ll b, ll c) {ll ans &#61; 1;a &#61; a % c;while (b) {if (b % 2)ans &#61; ans * a%c;b /&#61; 2; a &#61; a * a%c;}return ans;
}struct splay {int fa, ch[2], size;int lazy, rev, maxx, value;
}Sp[maxn];int n, m, root, a[maxn];
void pushup(int rt) {Sp[rt].size &#61; Sp[Sp[rt].ch[0]].size &#43; Sp[Sp[rt].ch[1]].size &#43; 1;Sp[rt].maxx &#61; max(Sp[rt].value, max(Sp[Sp[rt].ch[0]].maxx, Sp[Sp[rt].ch[1]].maxx));
}void pushdown(int rt) {if (Sp[rt].lazy) {if (Sp[rt].ch[0]) {Sp[Sp[rt].ch[0]].lazy &#43;&#61; Sp[rt].lazy;Sp[Sp[rt].ch[0]].maxx &#43;&#61; Sp[rt].lazy;Sp[Sp[rt].ch[0]].value &#43;&#61; Sp[rt].lazy;}if (Sp[rt].ch[1]) {Sp[Sp[rt].ch[1]].lazy &#43;&#61; Sp[rt].lazy;Sp[Sp[rt].ch[1]].maxx &#43;&#61; Sp[rt].lazy;Sp[Sp[rt].ch[1]].value &#43;&#61; Sp[rt].lazy;}Sp[rt].lazy &#61; 0;}if (Sp[rt].rev) {if (Sp[rt].ch[0]) {Sp[Sp[rt].ch[0]].rev ^&#61; 1;swap(Sp[Sp[rt].ch[0]].ch[0], Sp[Sp[rt].ch[0]].ch[1]);}if (Sp[rt].ch[1]) {Sp[Sp[rt].ch[1]].rev ^&#61; 1;swap(Sp[Sp[rt].ch[1]].ch[0], Sp[Sp[rt].ch[1]].ch[1]);}Sp[rt].rev &#61; 0;}
}int id(int x) {return Sp[Sp[x].fa].ch[1] &#61;&#61; x;
}
void link(int son, int fa, int k) {Sp[son].fa &#61; fa; Sp[fa].ch[k] &#61; son;
}void rotate(int x) {int y &#61; Sp[x].fa;int z &#61; Sp[y].fa;int yk &#61; id(x);int zk &#61; id(y);int b &#61; Sp[x].ch[yk ^ 1];link(b, y, yk); link(y, x, yk ^ 1);link(x, z, zk);pushup(y); pushup(x);
}void SPLAY(int x, int aim) {while (Sp[x].fa !&#61; aim) {int y &#61; Sp[x].fa;int z &#61; Sp[y].fa;if (z !&#61; aim)id(x) &#61;&#61; id(y) ? rotate(y) : rotate(x);rotate(x);}if (aim &#61;&#61; 0)root &#61; x;
}int kth(int k) {int now &#61; root;while (1) {pushdown(now);int left &#61; Sp[now].ch[0];if (Sp[left].size &#43; 1 &#61; k)now &#61; left;else return now;}
}int build(int l, int r, int fa) {if (l > r)return 0;if (l &#61;&#61; r) {Sp[l].fa &#61; fa; Sp[l].maxx &#61; Sp[l].value &#61; a[l];Sp[l].size &#61; 1; return l;}int mid &#61; (l &#43; r) >> 1;Sp[mid].ch[0] &#61; build(l, mid - 1, mid);Sp[mid].ch[1] &#61; build(mid &#43; 1, r, mid);Sp[mid].value &#61; a[mid];Sp[mid].fa &#61; fa;pushup(mid);return mid;
}int split(int l, int r) {l &#61; kth(l); r &#61; kth(r &#43; 2);SPLAY(l, 0); SPLAY(r, l);return Sp[Sp[root].ch[1]].ch[0];
}void upd(int l, int r, int v) {int now &#61; split(l, r);Sp[now].lazy &#43;&#61; v; Sp[now].maxx &#43;&#61; v; Sp[now].value &#43;&#61; v;pushup(Sp[root].ch[1]); pushup(root);
}void Reverse(int l, int r) {int now &#61; split(l, r);Sp[now].rev ^&#61; 1;swap(Sp[now].ch[0], Sp[now].ch[1]);pushup(Sp[root].ch[1]); pushup(root);
}
int query(int l, int r) {return Sp[split(l, r)].maxx;
}void dfs(int rt) {pushdown(rt);if (Sp[rt].ch[0])dfs(Sp[rt].ch[0]);if (Sp[rt].value !&#61; inf && Sp[rt].value !&#61; -inf) {cout <}int main()
{//ios::sync_with_stdio(0);rdint(n); rdint(m);for (int i &#61; 2; i <&#61; n &#43; 1; i&#43;&#43;)a[i] &#61; i - 1;a[1] &#61; -inf; a[n &#43; 2] &#61; inf;root &#61; build(1, n &#43; 2, 0);while (m--) {int l, r; rdint(l); rdint(r);Reverse(l, r);}dfs(root); cout <}

 


转:https://www.cnblogs.com/zxyqzy/p/10073020.html



推荐阅读
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了SPOJ2829题目的解法及优化方法。题目要求找出满足一定条件的数列,并对结果取模。文章详细解释了解题思路和算法实现,并提出了使用FMT优化的方法。最后,对于第三个限制条件,作者给出了处理方法。文章最后给出了代码实现。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
author-avatar
平凡快乐的girl_819
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有