区间反转 先发代码 待会再谈感悟

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<cmath>
  6 #define rep(i,l,r) for(int i=l;i<r;i++)
  7 #define clr(a,x) memset(a,x,sizeof(a))
  8 using namespace std;
  9 const int maxn=100005,maxm=100005;
 10 int n,m;
 11 struct node*null,*pt;
 12 struct node{
 13     node*ch[2];
 14     int v,s;
 15     bool rev;
 16     node(int v1=0):v(v1),s(1),rev(0){
 17         ch[0]=ch[1]=null;
 18     }
 19     inline int cmp(int k)const{
 20         k-=ch[0]->s;
 21         if(k==1) return -1;
 22         return k<=0?0:1;
 23     }
 24     inline void update(){
 25         s=ch[0]->s+ch[1]->s+1;
 26     }
 27     inline void pushdown(){
 28         if(rev){
 29             rev=0;
 30             swap(ch[0],ch[1]);
 31             ch[0]->rev^=1;
 32             ch[1]->rev^=1;
 33         }
 34     }
 35     void*operator new(size_t){
 36         return pt++;
 37     }
 38 };
 39 node*root;
 40 node x[maxn];
 41 void rotate(node*&o,int d)
 42 {
 43     node* k=o->ch[d^1];
 44     o->ch[d^1]=k->ch[d];
 45     k->ch[d]=o;
 46     o->update();
 47     k->update();
 48     o=k;
 49 }
 50 void splay(node*&o,int k)
 51 {
 52     o->pushdown();
 53     int d=o->cmp(k);
 54     if(d==-1) return;
 55     if(d==1) k-=o->ch[0]->s+1;
 56     node*p=o->ch[d];
 57     p->pushdown();
 58     int d2=p->cmp(k);
 59     int k2=d2?k-p->ch[0]->s-1:k;
 60     if(d2!=-1){
 61         splay(p->ch[d2],k2);
 62         d==d2?rotate(o,d^1):rotate(o->ch[d],d);
 63     }
 64     rotate(o,d^1);
 65 }
 66 node*build(int l,int r)
 67 {
 68     if(l>=r) return null;
 69     int mid=(l+r)>>1;
 70     node*o=new node(mid);
 71     if(l<mid) o->ch[0]=build(l,mid);
 72     if(r>mid+1) o->ch[1]=build(mid+1,r);
 73     o->update();
 74     return o;
 75 }
 76 void init()
 77 {
 78     pt=x;
 79     null=new node();
 80     null->s=0;
 81     root=build(0,n+2);
 82 }
 83 void dfs(node*o)
 84 {
 85     if(o==null) return;
 86     o->pushdown();
 87     dfs(o->ch[0]);
 88     if(o->v>=1&&o->v<=n) printf("%d ",o->v);
 89     dfs(o->ch[1]);
 90 }
 91 int read()
 92 {
 93     int ans=0,f=1;
 94     char c;
 95     c=getchar();
 96     while(!isdigit(c)){
 97         if(c=='-') f=-1;
 98         c=getchar();
 99     }
100     while(isdigit(c)){
101         ans=ans*10+c-'0';
102         c=getchar();
103     }
104     return f*ans;
105 }
106 int main()
107 {
108     n=read();
109     m=read();
110     init();
111     while(m--){
112         int l=read(),r=read();
113         if(l==r) continue;
114         splay(root,l);
115         splay(root->ch[1],r+1-root->ch[0]->s);
116         root->ch[1]->ch[0]->rev^=1;
117     }
118     dfs(root);
119     return 0;
120 }

View Code

3223: Tyvj 1729 文艺平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1848  Solved: 1026
[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

HINT

N,M<=100000

Source

平衡树

[Submit][Status][Discuss]

转载于:https://www.cnblogs.com/chensiang/p/4618456.html

bzoj3223 splay相关推荐

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

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

  2. 【BZOJ3223】文艺平衡树,Splay反转区间

    传送门 写在前面:感觉身体被掏空 思路:不明 注意:打标记 #include<cstdio> #include<cstring> #include<iostream> ...

  3. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

  4. 简析平衡树(三)——浅谈Splay

    前言 原本以为\(Treap\)已经很难了,学习了\(Splay\),我才知道,没有最难,只有更难.(强烈建议先去学一学\(Treap\)再来看这篇博客) 简介 \(Splay\)是平衡树中的一种,除 ...

  5. AVL树、splay树(伸展树)和红黑树比较

    AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...

  6. bzoj1251: 序列终结者 (splay)

    splay可以用于维护序列,比如noi的维修序列,比如这道 发现当时splay没写总结,也没题解 然后重新写splay竟然耗了一个晚上 结果是因为max[0]没有附最小值!!血一样的教训 最后祭出in ...

  7. BZOJ 1503 郁闷的出纳员(splay)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...

  8. [BZOJ1503]郁闷的出纳员(Splay)

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...

  9. Splay ---- 2018牛客多校第三场 区间翻转搞区间位移 或者 rope可持久化块状链表

    题目链接 题目大意: 就是每次把牌堆中若干个连续的牌放到堆顶,问你最后牌的序列. 解题思路: Splay 区间翻转的模板题: 对于一个区间[1,2,3,4,5,6,7,8][1,2,3,4,5,6,7 ...

最新文章

  1. nginx源码编译、负载均衡及模块的扩展
  2. 如何一小时杀入天池OCR比赛前排?
  3. is 和 == 以及 编码和解码
  4. 从业务需求抽象成模型解决方案
  5. shell 执行脚本
  6. 一道计算时间的机试题
  7. inflect java_关于Platinum库的MediaRender具体C++代码实现探讨
  8. Android学习笔记之Broadcast Receiver
  9. 没事学学docker(三):配置阿里云镜像加速以及解决docker起不来的问题
  10. 最新 eclipse 安装SVN插件
  11. [转贴]记那对住在我隔壁储藏室的大学刚毕业的小夫妻
  12. jmeter常用操作说明
  13. vue图片裁剪插件vue-cropper
  14. WinCC 中批量绑定变量
  15. 阿里巴巴社招Java面试题做题记录
  16. JSON数据交互和RESTful支持
  17. 产品沉思录精选:为何知识资本将胜过金融资本
  18. mysql在windows安装和卸载步骤,以及相关问题的解决记录
  19. 阅读 git 最初版源码总结
  20. 分享一款多功能免费SEO工具箱-从0开始打造高流量网站

热门文章

  1. Memcached Java客户端2.6.1发布
  2. Leetcode 532.数组中的K-diff数对
  3. js条件语句,用if...else if....else方程ax2+bx+c=0一元二次方程。求根
  4. LCA 在线倍增法 求最近公共祖先
  5. java学习笔记-set
  6. Ouath 验证过程
  7. Deep Learning回顾之LeNet、AlexNet、GoogLeNet、VGG、ResNet
  8. OpenStack技术峰会PPT集萃
  9. 结合MongoDB开发LBS应用
  10. 深度解析】Google第二代深度学习引擎TensorFlow开源(CMU邢波独家点评、白皮书全文、视频翻译)