P3391 【模板】文艺平衡树(Splay)新板子

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

题目背景

这是一道经典的Splay模板题——文艺平衡树。

题目描述

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

输入输出格式

输入格式:

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

接下来m行每行两个数 [l,r][l,r] 数据保证 1 \leq l \leq r \leq n1≤l≤r≤n

输出格式:

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

输入输出样例

输入样例#1: 复制

5 3
1 3
1 3
1 4

输出样例#1: 复制

4 3 2 1 5

说明

n, m \leq 100000n,m≤100000

code

  1 #include<cstdio>
  2 #include<algorithm>
  3
  4 using namespace std;
  5
  6 const int MAXN = 100100;
  7 int fa[MAXN],ch[MAXN][2],tag[MAXN],siz[MAXN],data[MAXN];
  8 int Root,tn,n;
  9
 10 inline char nc() {
 11     static char buf[100000],*p1 = buf,*p2 = buf;
 12     return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2) ? EOF : *p1++;
 13 }
 14 inline int read() {
 15     int x = 0,f = 1;char ch = nc();
 16     for (; ch<‘0‘||ch>‘9‘; ch = nc())
 17         if (ch==‘-‘) f = -1;
 18     for (; ch>=‘0‘&&ch<=‘9‘; ch = nc())
 19         x = x*10+ch-‘0‘;
 20     return x * f;
 21 }
 22 inline int son(int x) {
 23     return x == ch[fa[x]][1];
 24 }
 25 inline void pushup(int x) {
 26     siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + 1;
 27 }
 28 inline void pushdown(int x) {
 29     if (tag[x]) {
 30         tag[ch[x][0]] ^= 1;
 31         tag[ch[x][1]] ^= 1;
 32         swap(ch[x][0],ch[x][1]);
 33         tag[x] = 0;
 34     }
 35 }
 36 inline void rotate(int x) {
 37     int y = fa[x],z = fa[y],b = son(x),c = son(y),a = ch[x][!b];
 38     if (z) ch[z][c] = x;else Root = x;fa[x] = z;
 39     ch[x][!b] = y;fa[y] = x;
 40     ch[y][b] = a;if (a) fa[a] = y;
 41     pushup(y);pushup(x);
 42 }
 43 inline void splay(int x,int rt) {
 44     while (fa[x] != rt) {
 45         int y = fa[x],z = fa[y];
 46         if (z==rt) rotate(x);
 47         else {
 48             if (son(x)==son(y)) rotate(y),rotate(x);
 49             else rotate(x),rotate(x);
 50         }
 51     }
 52 }
 53 inline int getkth(int k) {
 54     int p = Root;
 55     while (true) {
 56         pushdown(p);
 57         if (k == siz[ch[p][0]] + 1) return p;
 58         if (ch[p][0] && k<=siz[ch[p][0]]) p = ch[p][0];
 59         else {
 60             k -= ((ch[p][0] ? siz[ch[p][0]] : 0) + 1);
 61             p = ch[p][1];
 62         }
 63     }
 64 }
 65 void Reverse(int l,int r) {
 66     int L = getkth(l),R = getkth(r+2);
 67     splay(L,0);splay(R,L);
 68     tag[ch[R][0]] ^= 1;
 69 }
 70 inline void Connect(int x,int pa,int f) {
 71     fa[x] = pa;ch[pa][f] = x;
 72 }
 73 int build(int l,int r) {
 74     if (l > r) return 0;
 75     int mid = (l + r) >> 1;
 76     int t = build(l,mid-1);
 77     ch[mid][0] = t;fa[t] = mid;
 78     t = build(mid+1,r);
 79     ch[mid][1] = t;fa[t] = mid;
 80     pushup(mid);
 81     return mid;
 82 }
 83 void Print(int x) {
 84     if (!x) return;
 85     pushdown(x);
 86     Print(ch[x][0]);
 87     if (x > 1 && x < n+2) printf("%d ",x-1);
 88     Print(ch[x][1]);
 89 }
 90 int main() {
 91     n = read();
 92     Root = build(1,n+2);
 93     /*for(int i=1;i<=n+2;i++) {
 94         siz[i] = n+3-i;
 95         fa[i] = i-1;
 96         ch[i][1] = i+1;
 97     }
 98     ch[n+2][1]=0,Root=1;*/
 99     int m = read();
100     while (m--) {
101         int a = read(),b = read();
102         Reverse(a,b);
103     }
104     Print(Root);
105     return 0;
106 }
时间: 2024-10-16 21:44:23

P3391 【模板】文艺平衡树(Splay)新板子的相关文章

洛谷 P3391 【模板】文艺平衡树(Splay)

题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是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][l,r] 数据保证 1≤l≤r≤n 输出格式: 输出一行n个数字,表示原始序列经过m次变换后的结果

Tyvj P1729 文艺平衡树 Splay

题目: http://tyvj.cn/p/1729 P1729 文艺平衡树 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 此为平衡树系列第二道:文艺平衡树 描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 输入格式 第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n)  m表示翻转操作次数

BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3595  Solved: 2029[Submit][Status][Discuss] Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 Input 第一行为n,m n表示初始序列有n个数,这个序列依次

[bzoj3223]文艺平衡树(splay区间反转模板)

解题关键:splay模板题. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; const int N = 100005; int ch[N][2],par[N],val[N],cnt[

3224: Tyvj 1728 普通平衡树(新板子)

3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 17048  Solved: 7429[Submit][Status][Discuss] Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. 求x的前驱(前驱定义为

JZYZOJ1998 [bzoj3223] 文艺平衡树 splay 平衡树

http://172.20.6.3/Problem_Show.asp?id=1998 平衡树区间翻转的板子,重新写一遍,给自己码一个板子. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #include<cstdlib> 7 using namespace std; 8 cons

[BZOJ3223] [Tyvj1729] 文艺平衡树 (splay)

Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 Input 第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n)  m表示翻转操作次数 接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n Output 输出一行n个数字,表示原始序列经过m次变换后的结果 Sample Input 5 3 1 3

模板 文艺平衡树

Splay模板,学完觉得比Treap简单,不过均摊的logn不能可持久化. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define ls ch[0] 5 #define rs ch[1] 6 struct trnt{ 7 int ch[2]; 8 int chd; 9 int wgt; 10 int fa; 11 int v; 12 }tr[10000000]; 13 int root

[Bzoj3223][Tyvj1729] 文艺平衡树(splay/无旋Treap)

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3223 平衡树处理区间问题的入门题目,普通平衡树那道题在维护平衡树上是以每个数的值作为维护的标准,而处理区间问题时,维护平衡树的应该是每个位置的下标,所以平衡树中序遍历时应该是当前区间的样子.例如: {1 2 3 4 5}翻转区间1 3,则中序遍历应该输出{3,2,1,4,5}. 提供splay和无旋Treap的做法. splay做法: 1 #include<bits/stdc++.h>

bzoj 3223 文艺平衡树 Splay 打标志

是NOI2003Editor的一个子任务 1 #include <cstdio> 2 #include <vector> 3 #define maxn 100010 4 using namespace std; 5 6 struct Splay { 7 int pre[maxn], son[maxn][2], siz[maxn], rev[maxn], root; 8 9 void update( int nd ) { 10 siz[nd] = siz[son[nd][0]]+si