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中的事件对象
JavaScript中的事件对象 JavaScript中的事件对象是非常重要的,恐怕是我们在项目中使用的最多的了.在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有 ...
- HBase基础和伪分布式安装配置
一.HBase(NoSQL)的数据模型 1.1 表(table),是存储管理数据的. 1.2 行键(row key),类似于MySQL中的主键,行键是HBase表天然自带的,创建表时不需要指定 1.3 ...
- ubuntu删除输入法后,循环登陆
在登陆界面ctrl+alt+F1进入tty界面,登陆账号,然后输入 dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P 可以参考Ubuntu1 ...
- 谁再说Matlab速度慢,我跟谁急
谁再说Matlab速度慢,我跟谁急 一.未进行内存预分配 y = 0; tic; for i=2:100000; y(i+1) = y(i)+ randn; end; toc 时间已过 0.03122 ...
- js控制全屏窗口
<script src="__PUBLIC__/Js/jquery.min.js"></script> <script type="text ...
- python 常见排序实例
使用Python 基础排序算法设计,冒泡排序,插入排序,快速排序... 需求 对一组无序数据进行排序算法设计,要求如下: 输入:[1, 3, 5, 23, 75, 34, 456, 86, 22, 7 ...
- Yii URL
参考文章: http://blog.csdn.net/iefreer/article/details/21325371 以http://localhost/basic/web/index.php?r= ...
- sql语句积累
有一个需求表(demand),每一记录就是一条需求:另外有一个报价表(quotation),每一条记录是对需求记录的报价详情. 需求表: 报价表: 我现在想得到每条需求的信息以及有多少人报价了,我们可 ...
- array_map与array_column之间的关系
/*|----------------------------------------------------------|array_map();将回调函数作用到给定数组的单元上|array_col ...
- iwebshop二次开发(2)
设置模板为mini模式,类似于JSP中的sitemesh public $layout='site_mini'; 登录模块实现 function wuliu_login() { //如果已经登录,就跳 ...