3223: Tyvj 1729 文艺平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 4854  Solved: 2844
[Submit][Status][Discuss]

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
1 3
1 4

Sample Output

4 3 2 1 5

每次翻转操作[l, r]直接将节点l-1翻转到根,将节点r+1翻转到根的右孩子

这样r+1的左子树就是要翻转的区间了!

将该子树中所有节点的两个儿子交换位置就好了

直接暴力可能会超时,打延迟标记即可

splay参考http://blog.csdn.net/jaihk662/article/details/75213675

#include<stdio.h>
#include<algorithm>
using namespace std;
int n, m, root;
int fa[100077], tre[100077][2], v[100077];
int siz[100077];
bool rev[100077];
void Update(int k)
{siz[k] = siz[tre[k][0]]+siz[tre[k][1]]+1;
}
void Create(int l, int r, int last)
{int mid;if(l>r)return;mid = (l+r)/2;if(l==r){siz[mid] = 1;fa[mid] = last;if(mid<last)  tre[last][0] = mid;else  tre[last][1] = mid;return;}Create(l, mid-1, mid);Create(mid+1, r, mid);fa[mid] = last;Update(mid);if(mid<last)  tre[last][0] = mid;else  tre[last][1] = mid;
}
void Lazy(int k)
{if(rev[k]){swap(tre[k][0], tre[k][1]);rev[tre[k][0]] ^= 1;rev[tre[k][1]] ^= 1;rev[k] = 0;}
}
void Rotate(int x, int &k)
{int l, r, y, z;y = fa[x], z = fa[y];if(tre[y][0]==x)  l = 0;else  l = 1;r = l^1;if(y==k)k = x;else{if(tre[z][0]==y)  tre[z][0] = x;else  tre[z][1] = x;}fa[x] = z, fa[y] = x;fa[tre[x][r]] = y;tre[y][l] = tre[x][r];tre[x][r] = y;Update(y);Update(x);
}
void Splay(int x, int &k)
{int y, z;while(x!=k){y = fa[x], z = fa[y];if(y!=k){if((tre[y][0]==x)^(tre[z][0]==y))Rotate(x, k);elseRotate(y, k);}Rotate(x, k);}
}
int Find(int k, int rank)
{int l, r;Lazy(k);l = tre[k][0], r = tre[k][1];if(siz[l]+1==rank)return k;else if(siz[l]>=rank)return Find(l, rank);elsereturn Find(r, rank-siz[l]-1);
}
void Turn(int l, int r)
{int x, y, z;x = Find(root, l-1);y = Find(root, r+1);Splay(x, root);Splay(y, tre[x][1]);z = tre[y][0];rev[z] ^= 1;
}
int main(void)
{int i, l, r;scanf("%d%d", &n, &m);for(i=1;i<=n+2;i++)v[i] = i;Create(1, n+2, 0);root = (n+3)/2;for(i=1;i<=m;i++){scanf("%d%d", &l, &r);Turn(l+1, r+1);}for(i=2;i<=n+1;i++)printf("%d ", Find(root, i)-1);printf("\n");return 0;
}

splay区间翻转(bzoj 3223: Tyvj 1729 文艺平衡树)相关推荐

  1. BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 6881  Solved: 4213 [Submit][S ...

  2. BZOJ 3223: Tyvj 1729 文艺平衡树(splay)

    速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...

  3. fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)...

    题面: [模板]文艺平衡树(Splay) 题解:无 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostr ...

  4. bzoj 3223: Tyvj 1729 文艺平衡树

    Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2853  Solved: 1602 [Submit][Status][Discuss] Descri ...

  5. [Tyvj 1729] 文艺平衡树

    题面如下: Tyvj 1729 文艺平衡树 Time Limit: 1 Sec  Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个有 ...

  6. [HZOI 2016][Tyvj 1729]文艺平衡树 这道题我真是哭了,调了一下午,一晚上

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

  7. BZOJ Tyvj 1729 文艺平衡树

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

  8. 【Splay】【块状链表】bzoj3223 Tyvj 1729 文艺平衡树

    让蒟蒻见识到了常数大+滥用STL的危害. <法一>很久之前的Splay #include<cstdio> #include<algorithm> using nam ...

  9. P3391 文艺平衡树(Splay区间翻转)

    题解: Splay区间反转的模板题. 翻转[3,5]时,我们可以将3的前驱找到,5的后继找到,然后根节点的右儿子的左子树就是属于[3,5]这个区间的数,可以自己画画就容易知道了. 然后就是给这个结点打 ...

最新文章

  1. Python之初识函数(Day11)
  2. SQL Server SqlCacheDependency 缓存依赖
  3. AJAX开发简略 (转)
  4. Python:一篇文章掌握Numpy的基本用法
  5. [密码学] 双重与三重DES
  6. FreeMaker导出word
  7. ISO 5 Lecture for Micro-Macro Interactions
  8. Linux下用Python调用C模块
  9. 【嵌入式】Libmodbus之RTU模式Master端程序示例
  10. java多线程知识_学习知库丨Java多线程知识大全
  11. 计算机软件应用员,济宁计算机办公应用软件操作员
  12. android高级资料
  13. MySQL快速上手[学习笔记](二)
  14. R 语言的学习 —— 环境准备与安装
  15. 【ML】特征归一化、为什么归一化、归一化的方法、归一化方法选择依据
  16. 远程访问内网服务器使用FRP实现内网穿透
  17. python彩蛋_隐藏在Python中的15个彩蛋
  18. MIT 6.824学习-GFS
  19. some和every的区别和用法
  20. Excel数据导入到hbase实战

热门文章

  1. python有哪些用途-python的主要用途是什么
  2. 简单python脚本实例-终于晓得python入门脚本实例
  3. python 干什么工作具有明显优势-Python在数据分析方面有什么独特优势
  4. runtimeerror怎么解决python_如何解决这个python错误? RuntimeError:字典在迭代期间改变了大小...
  5. nvm切换node版本的命令
  6. 计算机老师的专业发展怎么写,高职计算机教师专业发展研究
  7. 【数组】牛客网:调整数组顺序使奇数位于偶数前面(一)
  8. telnet和ping区别
  9. CSS中给表格的第一列及最后一列设置不同的样式
  10. 表单设置 disabled 后无法传值到后台的解决办法