BZOJ3223——Tyvj 1729 文艺平衡树
1、题目大意:维护序列,只有区间翻转这个操作
2、分析:splay的经典操作就是实现区间翻转,就是在splay中有一个标记,表示这个区间被翻转了
然后就是记得各种的操作访问某个点时,记得下传,顺便交换一下左右子树的左右子树(我语文不好
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; struct Node{ Node *ch[2]; int f, v, s; int cmp(int x){ if(x < v) return 0; else if(x == v) return -1; else return 1; } int cmp1(int x){ int k = 1; if(ch[0]) k += ch[0] -> s; if(x < k) return 0; else if(x == k) return -1; else if(x > k) return 1; } void maintain(){ s = 1; if(ch[0]) s += ch[0] -> s; if(ch[1]) s += ch[1] -> s; } void pushdown(){ if(f == 1){ if(ch[0] != NULL){ ch[0] -> f ^= 1; swap(ch[0] -> ch[0], ch[0] -> ch[1]); } if(ch[1] != NULL){ ch[1] -> f ^= 1; swap(ch[1] -> ch[0], ch[1] -> ch[1]); } f = 0; } } }; struct splay_tree{ Node ft[2000000]; Node *root; int a[200000], tot; void rotate(Node* &o, int d){ Node *k = o -> ch[d ^ 1]; k -> pushdown(); o -> ch[d ^ 1] = k -> ch[d]; k -> ch[d] = o; o -> maintain(); k -> maintain(); o = k; } void splay(Node* &o, int k){ if(!o) return; o -> pushdown(); if(o -> ch[0]) o -> ch[0] -> pushdown(); if(o -> ch[1]) o -> ch[1] -> pushdown(); int d = o -> cmp1(k); if(d == 1 && o -> ch[0]) k = k - o -> ch[0] -> s - 1; else if(d == 1) k --; if(d != -1){ Node* w = o -> ch[d]; int d2 = w -> cmp1(k); int k2 = k; if(d2 == 1){ k2 --; if(w -> ch[0]) k2 -= w -> ch[0] -> s; } if(d2 != -1){ splay(w -> ch[d2], k2); if(d == d2) rotate(o, d ^ 1); else rotate(o -> ch[d], d); } rotate(o, d ^ 1); } return; } Node* merge(Node *left, Node *right){ if(left == NULL) return right; if(right == NULL) return left; splay(left, left -> s); left -> ch[1] = right; left -> maintain(); return left; } void split(Node* &o, int k, Node* &left, Node* &right){ if(k == 0){ left = NULL; right = o; return; } splay(o, k); left = o; right = o -> ch[1]; left -> ch[1] = NULL; left -> maintain(); return; } void flip(int l, int r){ Node *left, *mid, *right; split(root, l - 1, left, mid); split(mid, r - l + 1, mid, right); swap(mid -> ch[0], mid -> ch[1]); mid -> f ^= 1; root = merge(left, merge(mid, right)); } int value(int l){ Node *left, *mid, *right; split(root, l - 1, left, mid); split(mid, 1, mid, right); int ret = mid -> v; root = merge(left, merge(mid, right)); return ret; } void insert(Node* &o, int l, int r){ if(r < l) return; int mid = (l + r) / 2; o = &ft[tot]; tot ++; o -> ch[0] = o -> ch[1] = NULL; o -> v = mid; o -> f = 0; if(l != r){ insert(o -> ch[0], l, mid - 1); insert(o -> ch[1], mid + 1, r); } o -> maintain(); return; } } wt; int main(){ int n, m; scanf("%d%d", &n, &m); for(int i = 1; i <= n; i ++) wt.a[i] = i; wt.insert(wt.root, 1, n); for(int i = 1; i <= m; i ++){ int l, r; scanf("%d%d", &l, &r); wt.flip(l, r); } for(int i = 1; i <= n; i ++){ printf("%d ", wt.value(i)); } return 0; }
BZOJ3223——Tyvj 1729 文艺平衡树的更多相关文章
- [BZOJ3223]Tyvj 1729 文艺平衡树
[BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
- bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2202 Solved: 1226[Submit][Sta ...
- 2018.08.05 bzoj3223: Tyvj 1729 文艺平衡树(非旋treap)
传送门 经典的平衡树问题,之前已经用splay写过一次了,今天我突发奇想,写了一发非旋treap的版本,发现挺好写的(虽然跑不过splay). 代码: #include<bits/stdc++. ...
- bzoj3223: Tyvj 1729 文艺平衡树 splay裸题
splay区间翻转即可 /************************************************************** Problem: 3223 User: walf ...
- 【Splay】bzoj3223 Tyvj 1729 文艺平衡树
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #i ...
- BZOJ3223: Tyvj 1729 文艺平衡树 无旋Treap
一开始光知道pushdown却忘了pushup......... #include<cstdio> #include<iostream> #include<cstring ...
- 【Splay】【块状链表】bzoj3223 Tyvj 1729 文艺平衡树
让蒟蒻见识到了常数大+滥用STL的危害. <法一>很久之前的Splay #include<cstdio> #include<algorithm> using nam ...
- BZOJ 3223: Tyvj 1729 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3628 Solved: 2052[Submit][Sta ...
随机推荐
- JavaScript---认识JavaScipt
认识JavaScript 1.什么是JavaScript? JavaScript是属于网络的脚本语言,她被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies以及更多的应用,她更是因特 ...
- BZOJ4527: K-D-Sequence 线段树
别人家的题解. #include<bits/stdc++.h> #define N 200005 #define M (l+r>>1) #define P (k<< ...
- BZOJ3685: 普通van Emde Boas树
显然这题的所有操作都可以用set,但是直接用set肯定要T,考虑到读入量较大,使用fread读入优化,就可以卡过去了. #include<bits/stdc++.h> using name ...
- C#中值类型和引用类型图解
举几个值类型和引用类型的内存配置: 值类型存储在栈中,引用类型堆里: 1,数组 数组是引用类型,但是数组的元素可以是值类型或引用类型 2. 结构 结构是值类型,简略的看个例子 struct sampl ...
- Windows10安装MongoDB
环境:Windows10x64,mongodb-win32-x86_64-2008plus-ssl-3.2.9-signed.msi 步骤: 安装msi文件到D:\ 新建配置文件mongo.confi ...
- JQuery------$.getJSON()方法的使用
html(../Home/Index.cshtml) <body> <button class="Btn">按钮</button> </b ...
- JQuery------$.ajax()的使用方法
菜鸟教程地址: http://www.runoob.com/jquery/ajax-ajax.html html(../Home/Index.cshtml) <body> <butt ...
- Maven环境变量配置
Maven 3.0.4版本下载地址: http://www.apache.org/dyn/closer.cgi?path=/maven/binaries/apache-maven-3.0.4-bin. ...
- Centos 6.0将光盘作为yum源的设置方法
在使用Centos 的时候,用yum来安装软件包是再方便不过了,但是如果在无法连接互联网的情况下,yum就不好用了. 下面介绍一种方式,就是将Centos安装光盘作为yum源,然后使用yum来安装软件 ...
- Javascript权威指南——第一章Javascript概述
示例:javascript贷款计算器 相关技术: 1.如何在文档中查找元素: 2.如何通过表单input元素来获取用户的输入数据: 3.如何通过文档元素来设置HTML内容: 4.如何将数据存储在浏览器 ...