当前位置: 首页 > news >正文

[BZOJ3223]文艺平衡树

题目大意:
  实现一个数据结构支持区间翻转操作共$n(n\leq100000)$次。

思路:
  Splay维护区间。
  对于区间$[l,r]$的翻转可以先将$l-1$旋转到根,再把$r+1$旋转到根的右子结点,此时根结点的右子结点的左子树就是需要翻转的区间。注意翻转过后结点的权值可能不满足二叉搜索树的性质,也不需要满足二叉搜索树的性质。

 1 #include<cstdio>
 2 #include<cctype>
 3 #include<algorithm>
 4 inline int getint() {
 5     register char ch;
 6     while(!isdigit(ch=getchar()));
 7     register int x=ch^'0';
 8     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
 9     return x;
10 }
11 const int N=100003;
12 int n,ans[N];
13 class SplayTree {
14     private:
15         int val[N],par[N],size[N],ch[N][2];
16         bool rev[N];
17         int sz,new_node(const int &x) {
18             val[++sz]=x;
19             size[sz]=1;
20             return sz;
21         }
22         void push_down(const int &p) {
23             if(!rev[p]) return;
24             std::swap(ch[p][0],ch[p][1]);
25             rev[ch[p][0]]^=1;
26             rev[ch[p][1]]^=1;
27             rev[p]=0;
28         }
29         void push_up(const int &p) {
30             size[p]=size[ch[p][0]]+size[ch[p][1]]+1;
31         }
32         void rotate(const int &x) {
33             const int y=par[x],z=par[y];
34             push_down(y),push_down(x);
35             const bool b=x==ch[y][0];
36             par[ch[x][b]=par[ch[y][!b]=ch[x][b]]=y]=x;
37             if(par[x]=z) par[ch[z][ch[z][1]==y]=x]=z;
38             push_up(y),push_up(x);
39         }
40         void splay(int x,const int &goal) {
41             for(register int y=par[x],z=par[y];y!=goal;rotate(x),z=par[y=par[x]]) {
42                 if(z!=goal) rotate((x==ch[y][0])^(y==ch[z][0])?x:y);
43             }
44             if(!goal) root=x;
45         }
46     public:
47         int root;
48         void insert(const int &x) {
49             int y=root;
50             while(ch[y][x>val[y]]) y=ch[y][x>val[y]];
51             par[ch[y][x>val[y]]=new_node(x)]=y;
52             splay(sz,0);
53         }
54         void build(const int &n) {
55             for(register int i=0;i<=n+1;i++) insert(i);
56         }
57         int find(int x) {
58             for(register int y=root;;y=ch[y][size[ch[y][0]]<x]) {
59                 push_down(y);
60                 if(par[y]&&y==ch[par[y]][1]) x-=size[ch[par[y]][0]]+1;
61                 if(size[ch[y][0]]==x) return y;
62             }
63         }
64         void reverse(const int &l,const int &r) {
65             splay(find(l-1),0);
66             splay(find(r+1),root);
67             rev[ch[ch[root][1]][0]]^=1;
68         }
69         void dfs(const int &p) {
70             push_down(p);
71             if(ch[p][0]) dfs(ch[p][0]);
72             if(val[p]&&val[p]<=n) ans[++ans[0]]=val[p];
73             if(ch[p][1]) dfs(ch[p][1]);
74         }
75 };
76 SplayTree t;
77 int main() {
78     t.build(n=getint());
79     for(register int i=getint();i;i--) {
80         const int l=getint(),r=getint();
81         t.reverse(l,r);
82     }
83     t.dfs(t.root);
84     for(register int i=1;i<=n;i++) printf("%d ",ans[i]);
85     return 0;
86 }

 

转载于:https://www.cnblogs.com/skylee03/p/8510660.html

相关文章:

  • ccf-20171203 Crontab问题
  • schtasks命令
  • 聚类分析——Kmeans
  • 元素外边距溢出(塌陷)
  • TCP/IP学习(29)——kernel如何选择socket接收数据
  • Core Data 的简单使用
  • 配置防盗链,访问控制
  • 过完年想要元气满满?赶紧看看这些VR AR大事件回个血
  • RocketMq部署(四)
  • oracle时间操作结合to_char和to_date使用
  • VS2017 Debug断点后显示UTF8字符串
  • 拥抱.NET Core系列:MemoryCache 缓存选项
  • 树莓派打造无线扫描仪.
  • 用“世界上最好的编程语言”制作的敲诈者木马揭秘
  • Docker容器部署时区问题的坑
  • php的引用
  • 网络传输文件的问题
  • 时间复杂度分析经典问题——最大子序列和
  • 【css3】浏览器内核及其兼容性
  • 11111111
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • CSS实用技巧
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript 基本功--面试宝典
  • Mocha测试初探
  • React的组件模式
  • Yii源码解读-服务定位器(Service Locator)
  • 基于web的全景—— Pannellum小试
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用Swoole加速Laravel(正式环境中)
  • 怎么把视频里的音乐提取出来
  • 你对linux中grep命令知道多少?
  • hi-nginx-1.3.4编译安装
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (二)Linux——Linux常用指令
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (一)kafka实战——kafka源码编译启动
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)Mysql的优化设置
  • (状压dp)uva 10817 Headmaster's Headache
  • *2 echo、printf、mkdir命令的应用
  • .bat批处理(一):@echo off
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net 简单实现MD5
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [1204 寻找子串位置] 解题报告
  • [APIO2012] 派遣 dispatching