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 ...
随机推荐
- log4net 记录到数据库和本地文件
1)配置代码 <?xml version="1.0" encoding="utf-8" ?> <configuration> <c ...
- sp_executesql 使用
sp_executesql 比 之前的exec @sql 区别在可以实现参数的传入传出 如 declare @sql nvarchar(2000) declare @pid varchar(20) s ...
- Java——新IO 缓冲区与Buffer
缓冲区和Buffer import java.nio.IntBuffer; //================================================= // File Na ...
- Java——其他容器
除了JFrame表示之外,还有其他几种常见的窗体:JPanel.JSplitPane.JTabbedPane.JScrollPane.JDesktopPane.JInternalFrame等. imp ...
- 对象Clone
//================================================= // File Name : Clone_demo //-------------------- ...
- Effective Objective-C 2.0 — 第五条用枚举表示状态、选项、状态码 (未看完)
枚举是一种常量命名方式.某个对象所经历的各种状态就可以定义为一个简单的枚举集.(enumeration set) 编译器会为枚举分配一个独有的编号,从0开始,每个枚举递增1.实现枚举所用的数据类型取决 ...
- ES6新特性--多行文本
由于多行字符串用\n写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用` ... `表示: `这是一个 多行 字符串`;
- 代码重构 & 常用设计模式
代码重构 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1 新建一个方法 ...
- shell脚本笔记(原创不断记录)
今天开始自己的shell脚本练习,刚好公司有太服务器,要时间对数据的cp是按月的: 考虑:首先寻找规律,发现都放置在/opt/www/aaa/ 里面有很多的2级和3级目录和文件,但我追踪要备份的是年 ...
- django view
当请求一个页面时,Django 创建一个包含有关请求数据的 HttpRequest 对象,并将它作为第一个参数传给视图函数,每个视图函数处理完相应逻辑后返回一个 HttpResponse 对象,Htt ...