题目大意

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


题解

splay裸题,维护子树翻转信息即可。


代码:

#include <cstdio>
#include <iostream>
using namespace std;struct Node {int key,siz;bool flip;Node *ch[2],*fa;Node();Node(int);void pushdown();void maintain();int dir(int val) {if(val==ch[0]->siz+1) return -1;return val>ch[0]->siz+1;}int son() {if(fa->ch[1]==this) return 1;if(fa->ch[0]==this) return 0;return -1;}
}*null,*root;
Node:: Node():key(-1) {siz=null?1:0;flip=false;ch[0]=ch[1]=fa=null;
}
Node:: Node(int _):key(_) {siz=null?1:0;flip=false;ch[0]=ch[1]=fa=null;
}
void Node:: maintain() {siz=ch[0]->siz+1+ch[1]->siz;return;
}
void Node:: pushdown() {if(flip) {swap(ch[0],ch[1]);ch[0]->flip^=1, ch[1]->flip^=1;flip=false;}return;
}void print(Node* cur) {if(cur==null) return;cur->pushdown();print(cur->ch[0]);cout<<cur->key<<" ";print(cur->ch[1]);
}#define mid ((l+r)>>1)
void build(Node* &cur,int l,int r) {if(l>r) {cur=null; return;}cur=new Node(mid);build(cur->ch[0],l,mid-1); cur->ch[0]->fa=cur;build(cur->ch[1],mid+1,r); cur->ch[1]->fa=cur;cur->maintain();
}
#undef midvoid Rotate(Node* cur,int dir) {Node* tmp=cur->ch[dir^1];cur->ch[dir^1]=tmp->ch[dir], tmp->ch[dir]->fa=cur;tmp->ch[dir]=cur;cur->maintain(), tmp->maintain();if(~cur->son()) cur->fa->ch[cur->son()]=tmp;tmp->fa=cur->fa, cur->fa=tmp;
}void Pushdown(Node* cur) {if(cur->fa!=null) Pushdown(cur->fa);cur->pushdown();
}void Splay(Node* cur) {while(~cur->son()) {int dir=cur->son();if(dir==cur->fa->son()) Rotate(cur->fa->fa,dir^1);Rotate(cur->fa,dir^1);}
}
Node* _find(Node *cur,int k) {cur->pushdown();int dir=cur->dir(k);if(dir==1) k-=cur->ch[0]->siz+1;if(dir==-1) return cur;else return _find(cur->ch[dir],k);
}Node* Merge(Node *lhs,Node* rhs) {if(lhs==null) return rhs;if(rhs==null) return lhs;Node* tmp=_find(lhs,lhs->siz);Splay(tmp);tmp->ch[1]=rhs, rhs->fa=tmp, tmp->maintain();return tmp;
}void Split(Node* org,int k,Node* &lhs,Node* &rhs) {if(k==0) {lhs=null, rhs=org;return;} else if(k==org->siz) {lhs=org, rhs=null;return;}Node* tmp=_find(org,k);Splay(tmp);lhs=tmp, rhs=tmp->ch[1];rhs->fa=null, lhs->ch[1]=null, lhs->maintain();return;
}void Reverse(int l,int r) {Node *lhs,*tmp,*mid,*rhs;Split(root,l-1,lhs,mid);Split(mid,r-l+1,mid,rhs);mid->flip^=1;root=Merge(Merge(lhs,mid),rhs);return;
}int main() {
#ifndef ONLINE_JUDGEfreopen("input.txt","r",stdin);freopen("output.txt","w",stdout);
#endif // ONLINE_JUDGEnull=new Node();null->ch[0]=null->ch[1]=null->fa=null;root=null;int n,m;scanf("%d%d",&n,&m);build(root,1,n);for(int i=1;i<=m;i++) {int l,r;scanf("%d%d",&l,&r);Reverse(l,r);}print(root);return 0;
}

BZOJ3323 文艺平衡树 (splay 绿色无毒模板)相关推荐

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

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

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

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

  3. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

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

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

  5. 文艺平衡树 Splay 学习笔记(1)

    (这里是Splay基础操作,reserve什么的会在下一篇里面讲) 好久之前就说要学Splay了,结果苟到现在才学习. 可能是最近良心发现自己实在太弱了,听数学又听不懂只好多学点不要脑子的数据结构. ...

  6. 史上最详尽的平衡树(splay)讲解与模板

    首先声明:万分感谢gty大哥的帮助!这年头能找到简单易懂的数组版平衡树模板只能靠学长了! 变量声明:f[i]表示i的父结点,ch[i][0]表示i的左儿子,ch[i][1]表示i的右儿子,key[i] ...

  7. 洛谷 P3391 【模板】文艺平衡树

    题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4 ...

  8. 【luogu P5055】【模板】可持久化文艺平衡树

    [模板]可持久化文艺平衡树 题目链接:luogu P5055 题目大意 要你维护插入,删除,区间翻转,区间求和. 但要求可持续化,即每次操作在一个历史版本上进行,且会产生一个新的历史版本 思路 看到题 ...

  9. 文艺平衡树(Splay)

    题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

最新文章

  1. linux c warning 'XXX' declared 'static' but never defined解决方法
  2. ORACLE 格式VARCHAR2(n CHAR) 与VARCHAR2(n)的区别
  3. 检测custom settype assign的UI view name
  4. 【无码专区8】三角形二维数点——计数有多少个给定点落在三角形区域内
  5. 电脑文件加密_教你一招解决电脑文件加密
  6. Scrapy框架实现持久化存储
  7. Github 常用命令
  8. Mysql基于Linux上的安装
  9. Maven pom.xml中的元素modules、parent、properties以及import(转)
  10. 如何获取小程序前端代码
  11. 爬虫国际统计局省市区
  12. 怎样准备全国大学生数模竞赛大学生篇非常全
  13. java clh_【死磕Java并发】-J.U.C之AQS:CLH同步队列 - Java 技术驿站-Java 技术驿站
  14. MATLAB颜色映像
  15. 去除bootstrap的table样式中单元格边框线
  16. 2021年终总结暨2022年计划安排
  17. 自从掌握了Google和百度的 16 个高级搜索技巧,我再也没有解决不了的 bug 了
  18. for、while、do while三种循环的流程图
  19. Linux脚本定时清理日志任务
  20. 电脑的记事本如何显示行和列?

热门文章

  1. nodejs+vue+elementui网上书城 图书销售商城网站express
  2. 中标麒麟系统u盘安装_U盘启动中标麒麟V6双系统安装教程
  3. 【Origin】Excel连接时的日期格式问题
  4. mysql网络商城毕业论文_网上商城(毕业论文)范例.doc
  5. 代码管理平台——svn、git、github、gitlab
  6. 不看后悔系列:GIF录制之王
  7. 笔记19 | 利用MediaRecorder实现录像
  8. 《福布斯》推出4名少年百万富翁
  9. ECharts gauge制作钟表
  10. 精灵宝可梦剑正在维护服务器,最期待在《精灵宝可梦:剑/盾》中保留/回归的玩法功能...