先orz一下clj...我的splay跟着他写的...

这道题很普通的splay我调了这么久 T T , 就是因为 null 的值初始化为0 , 结果就挂了...

--------------------------------------------------------------------------

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define rep( i , n ) for( int i = 0 ; i < n ; ++i )
#define clr( x , c ) memset( x , c , sizeof( x ) )
#define Rep( i , n ) for( int i = 1 ; i <= n ; ++i )
using namespace std;
const int maxn = 50000 + 5;
const int maxnode = maxn + 10;
const int inf = 0x7fffffff;
int n;
struct Node *pt , *null;
struct Node { 
Node *ch[ 2 ] , *p;
int val , mx , add , size;
bool rev;
Node() : val( 0 ) , add( 0 ) , rev( 0 ) , mx( 0 ) {
ch[ 0 ] = ch[ 1 ] = null;
}
bool d() {
return this == p -> ch[ 1 ];
}
void setc( Node* c , int d ) {
ch[ d ] = c;
c -> p = this;
}
void Rev() {
rev ^= 1;
}
void Add( int ad ) {
add += ad;
val += ad;
mx += ad;
}
void upd() {
size = ch[ 0 ] -> size + ch[ 1 ] -> size + 1;
mx = max( val , max( ch[ 0 ] -> mx , ch[ 1 ] -> mx ) );
}
void relax() {
if( add ) {
rep( i , 2 ) if( ch[ i ] != null )
   ch[ i ] -> Add( add );
add = 0;
}
if( rev ) {
swap( ch[ 0 ] , ch[ 1 ] );
rep( i , 2 ) if( ch[ i ] != null ) 
   ch[ i ] -> Rev();
rev = false;
}
}
void* operator new( size_t ) {
return pt++;
}
};
Node NODE[ maxnode ];
Node* root;
void rot( Node* t ) {
Node* p = t -> p;
p -> relax();
t -> relax();
int d = t -> d();
p -> p -> setc( t , p -> d() );
p -> setc( t -> ch[ ! d ] , d );
t -> setc( p , ! d );
p -> upd();
if( p == root )
   root = t;
}
Node* select( int k ) {
for( Node* t = root ; ; ) {
t -> relax();
int s = t -> ch[ 0 ] -> size;
if( k == s ) return t;
else if( k > s ) {
k -= s + 1;
t = t -> ch[ 1 ];
} else 
   t = t -> ch[ 0 ];
}
}
void splay( Node* t , Node* f = null ) {
while( t -> p != f ) {
if( t -> p -> p == f ) rot( t );
else if( t -> d() != t -> p -> d() ) rot( t ) , rot( t );
else rot( t -> p ) , rot( t );
}
t -> upd();
}
Node* &get( int l , int r ) {
l-- , r++;
Node* L = select( l );
Node* R = select( r );
splay( L );
splay( R , L );
return R -> ch[ 0 ];
}
// [ l , r )
Node* build( int l , int r ) {
if( l >= r ) 
   return null;
int m = ( l + r ) >> 1;
Node* t = new( Node );
t -> setc( build( l , m ) , 0 );
t -> setc( build( m + 1 , r ) , 1 );
t -> upd();
return t;
}
void init() {
pt = NODE;
null = new( Node );
null -> size = 0;
null -> val = -inf;
null -> mx = -inf;
root = build( 0 , n + 2 );
root -> p = null;
}
int main() {
freopen( "test.in" , "r" , stdin );
freopen( "test.out" , "w" , stdout );
int m;
cin >> n >> m;
init();
while( m-- ) {
int op , L , R;
scanf( "%d%d%d" , &op , &L , &R );
Node* &t = get( L , R );
if( op == 1 ) {
int v;
scanf( "%d" , &v );
t -> Add( v );
splay( t );
} else if( op == 2 ) {
t -> Rev();
splay( t );
} else 
   printf( "%d\n" , t -> mx );
}
return 0;
}

--------------------------------------------------------------------------

1251: 序列终结者

Time Limit: 20 Sec  Memory Limit: 162 MB
Submit: 2735  Solved: 1086
[Submit][Status][Discuss]

Description

网上有许多题,就是给定一个序列,要你支持几种操作:A、B、C、D。一看另一道题,又是一个序列 要支持几种操作:D、C、B、A。尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量……这样 我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个“库”可以依靠,没有什么其他的意思。这道题目 就叫序列终结者吧。 【问题描述】 给定一个长度为N的序列,每个序列的元素是一个整数(废话)。要支持以下三种操作: 1. 将[L,R]这个区间内的所有数加上V。 2. 将[L,R]这个区间翻转,比如1 2 3 4变成4 3 2 1。 3. 求[L,R]这个区间中的最大值。 最开始所有元素都是0。

Input

第一行两个整数N,M。M为操作个数。 以下M行,每行最多四个整数,依次为K,L,R,V。K表示是第几种操作,如果不是第1种操作则K后面只有两个数。

Output

对于每个第3种操作,给出正确的回答。

Sample Input

4 4
1 1 3 2
1 2 4 -1
2 1 3
3 2 4

Sample Output

2
【数据范围】
N<=50000,M<=100000。

HINT

Source

Splay

转载于:https://www.cnblogs.com/JSZX11556/p/4579341.html

BZOJ 1251: 序列终结者( splay )相关推荐

  1. BZOJ 1251 序列终结者 Splay

    题意: 给定初始值都为0的一个序列,三种操作. 第一种区间增加一个值,第二种区间翻转,第三种询问区间最大值. 解析: 因为有第二种所以不能上线段树了,只好上splay了. 好久不写splay刚开始一顿 ...

  2. bzoj 1251: 序列终结者 2011-12-20

    1251: 序列终结者Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 650  Solved: 277 [Submit][Status][Discus ...

  3. bzoj1251: 序列终结者 (splay)

    splay可以用于维护序列,比如noi的维修序列,比如这道 发现当时splay没写总结,也没题解 然后重新写splay竟然耗了一个晚上 结果是因为max[0]没有附最小值!!血一样的教训 最后祭出in ...

  4. 【bzoj1251】序列终结者(伸展树)

    [bzoj1251]序列终结者(伸展树) Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我 ...

  5. BZOJ1251 序列终结者

    BZOJ1251 序列终结者 题目:1. 将\([L,R]\)这个区间内的所有数加上\(V\). 2. 将\([L,R]\)这个区间翻转. 3. 求\([L,R]\)这个区间中的最大值. 最开始所有元 ...

  6. P4146 序列终结者 平衡树 + lazy维护

    传送门 文章目录 题意: 思路: 题意: 思路: 平衡树裸题,直接维护俩lazylazylazy就行了. 需要注意的是,只有儿子节点存在的时候才能更新,不然更新到000号节点之后,给000号点加上了奇 ...

  7. BZOJ1251序列终结者——非旋转treap

    题目描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...

  8. Splay ---- 区间翻转 区间最大值 区间加 P4146 序列终结者

    题目链接 题目大意: 解题思路: 这是一道很入门的Splay的题目 但是第一次写有很多坑点 首先是maxmaxmax值的更新:就是因为这个点的最小值是会出现负数负数的,当你左右儿子有一个没有的话,那么 ...

  9. BZOJ1251: 序列终结者

    [传送门:BZOJ1251] 简要题意: 给出一个长度为n的序列,有m个操作,3种操作: 1 l r k将l到r的数增加k 2 l r将l到r的数列翻转 3 l r求出l到r的最大值 题解: 裸SPL ...

最新文章

  1. CMU研究人员提出一种新的深部脑刺激方法,可延长帕金森病治疗效果
  2. binder IPC TRANSACTION过程分析(BC_TRANSACTION-Binder Driver)
  3. 【GNN】硬核!一文梳理经典图网络模型
  4. ASP.NET MVC升级到ASP.NET Core MVC踩坑小结
  5. 添加几个手机联系人_One UI 3.0: 更细腻、更好用,这才是手机系统该有的样子
  6. github因网络问题无法git clone解决办法
  7. 一杯水怎么测试_怎么测家里自然水的水质情况?
  8. java反射接口_Java反射详解
  9. linux 解压 7z 乱码,7z-linux下解决中文名乱码的终极办法
  10. 主机防火墙与访问控制
  11. python如何让程序暂停_王者荣耀集祝福linkedin雄攻略
  12. layui做折线图_详解layuiAdmin单页版根据后台json数据动态生成左侧菜单栏
  13. 总结git提交代码种遇到的报错
  14. C语言:统计句子中元音字母的个数
  15. android x5 webview报错,appium 混合 APP,x5 内核,webview 切换报错
  16. Qt创建停靠悬浮窗口实例
  17. WZOI-387图像相似度
  18. 论文数据获取工具——WebPlotDigitizer
  19. dns服务器会改变运营商吗,随便修改DNS会对网络产生什么影响?
  20. 谷歌浏览器java不能启动_selenium+java谷歌浏览器 网站打开不正常

热门文章

  1. python小项目推荐项目-推荐 10 个有趣的 Python 项目
  2. python入门需要多久-怎么自学python,大概要多久?
  3. 用python画皮卡丘画法-实现童年宝可梦,教你用Python画一只属于自己的皮卡丘
  4. python电脑配置要求-1.安装python3.5及电脑环境变量的配置
  5. 零基础学python视频百度云-零基础入门学习Python 小甲鱼视频教程
  6. python教学网站-自学python有什么网站
  7. python可以自学吗-python能够自学吗
  8. python手机版idle-Python IDLE下载
  9. 用python画皮卡丘教程-利用Python绘制萌萌哒的皮卡丘
  10. 如何用python画数据图-关于如何使用Python绘制基本数据图形模型