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 ...
随机推荐
- cobbler安装、部署、测试
cobbler功能介绍 官网:http://cobbler.github.io 安装 yum install -y httpd tftp dhcp cobbler cobbler-web pykick ...
- JS-用js的for循环实现九九乘法表以及其他算数题等
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>f ...
- Unicode 与 UTF 字符标准
Unicode 国际字符标准(UCS)是一个字符编码系统,它被设计用来支持世界各国不同语言书面文体之间的数据交换.处理以及显示. Unicode用两个字节表示一个字符.前127个字符与A ...
- spark 读取 elasticsearch数据
–master spark://10.8.2.100:7077 –jars /usr/local/spark-1.5.2/lib/elasticsearch-hadoop-2.1.1.jar
- C#的两个大方向
http://zhidao.baidu.com/link?url=wG9G_EaT3tRd5_7ndU3vpFqmuc6S8N7F5TpBYsDPEui3HQ-wcU7nqw-_aRpIwtXQbC3 ...
- TCP/UDP端口列表
http://zh.wikipedia.org/wiki/TCP/UDP%E7%AB%AF%E5%8F%A3%E5%88%97%E8%A1%A8 TCP/UDP端口列表 本条目可通过翻译外语维 ...
- HTML学习笔记——head、body及简单标签
1> title标签.网站关键词.网站描述.实现百度网的跳转 2> 单标签.对标签.p标签 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...
- windows查看占用端口的进程
1方法 先找到进程号: netstat -aon|findstr 再根据进程号得到进程: tasklist |findstr " 2结果
- cmake 编译 c++ dll 的一个例子
CMakeLists.txt project(xxx) add_library(xxx SHARED xxx.cpp) add_executable(yyy yyy.cpp) target_link_ ...
- HTMl5结构元素:article
article: 表示文档.页面.应用程序或站点中的自包含成分所构成的一个页面的一部分,并且这部分专用于独立地分类或复用.(例如:一个博客的帖子,一篇文章,一个视频文件等.)和<nav>一 ...