splay可以用于维护序列,比如noi的维修序列,比如这道

发现当时splay没写总结,也没题解

然后重新写splay竟然耗了一个晚上

结果是因为max【0】没有附最小值!!血一样的教训

最后祭出inline大法才过,我的splay真的慢到吐血

{$inline on}
{$M 1000000000,0,maxlongint}
const//mm=maxlongint>>2;maxn=60000;varsize,left,right,mark,fa,value,max:array[0..maxn]of longint;rev:array[0..maxn]of boolean;root,i,j,k,l,n,m,tot,x:longint;function new:longint;inline;
begininc(tot);exit(tot);
end;function mmax(x,y:longint):longint;inline;
beginif x<y then exit(y);exit(x)
end;procedure swap(var x,y:longint);inline;
vari:longint;
begini:=x;x:=y;y:=i;
end;procedure pushdown(x:longint);inline;
beginif x=0 then exit;if rev[x] then beginswap(left[x],right[x]);rev[left[x]]:=rev[left[x]] xor true;rev[right[x]]:=rev[right[x]] xor true;rev[x]:=false;end;if mark[x]<>0 then beginvalue[x]:=value[x]+mark[x];max[x]:=max[x]+mark[x];inc(mark[left[x]],mark[x]);inc(mark[right[x]],mark[x]);mark[x]:=0;end;
end;procedure update(x:longint);inline;
beginpushdown(x);pushdown(left[x]);pushdown(right[x]);size[x]:=size[left[x]]+size[right[x]]+1;max[x]:=mmax(value[x],mmax(max[left[x]],max[right[x]]));
end;procedure lt(x:longint);inline;
varu,k:longint;flag:boolean;
beginpushdown(x);pushdown(right[x]);k:=right[x];u:=fa[x];if left[u]=x then flag:=true else flag:=false;right[x]:=left[k];fa[right[x]]:=x;left[k]:=x;fa[x]:=k;update(x);update(k);fa[k]:=u;if flag then left[u]:=k else right[u]:=k;
end;procedure rt(x:longint);inline;
varu,k:longint;flag:boolean;
beginpushdown(x);pushdown(left[x]);k:=left[x];u:=fa[x];if left[u]=x then flag:=true else flag:=false;left[x]:=right[k];fa[left[x]]:=x;right[k]:=x;fa[x]:=k;update(x);update(k);fa[k]:=u;if flag then left[u]:=k else right[u]:=k;
end;procedure splay(x,u:longint);inline;
beginwhile fa[x]<>u do beginif fa[fa[x]]=u then beginif left[fa[x]]=x then rt(fa[x])else lt(fa[x]);exit;end;if left[fa[x]]=x then beginif left[fa[fa[x]]]=fa[x] then rt(fa[fa[x]]);rt(fa[x]);endelse beginif right[fa[fa[x]]]=fa[x] then lt(fa[fa[x]]);lt(fa[x]);end;end;
end;function find(x,y:longint):longint;inline;
beginpushdown(x);if size[left[x]]=y-1 then exit(x);if y<=size[left[x]] then exit(find(left[x],y))else exit(find(right[x],y-1-size[left[x]]));
end;function change(j,k:longint):longint;inline;
varnow:longint;
beginnow:=find(root,j);splay(now,0);root:=now;now:=find(root,k+2);splay(now,root);exit(now);
end;function build(l,r:longint):longint;inline;
varmid,x:longint;
beginmid:=(l+r)>>1;x:=new;value[x]:=0;size[x]:=r-l+1;rev[x]:=false;mark[x]:=0;left[x]:=0;right[x]:=0;if l=r then beginif (l=0) or (l=n+1) then value[x]:=-maxlongint>>1;max[x]:=value[x];exit(x);end;if l<mid then beginleft[x]:=build(l,mid-1);fa[left[x]]:=x;end;if mid<r then beginright[x]:=build(mid+1,r);fa[right[x]]:=x;end;update(x);exit(x);
end;beginreadln(n,m);max[0]:=-maxlongint;root:=build(0,n+1);while m>0 do begindec(m);read(j);if j=1 then beginreadln(j,k,l);x:=change(j,k);inc(mark[left[x]],l);update(x);update(root);endelseif j=2 then beginreadln(j,k);x:=change(j,k);rev[left[x]]:=rev[left[x]] xor true;update(x);update(root);endelse beginreadln(j,k);x:=change(j,k);writeln(max[left[x]]);end;end;
end.

View Code

splay还可以当普通的平衡树做?就是把旋转改为旋转为根?再找到题写吧。

转载于:https://www.cnblogs.com/Macaulish/p/4299044.html

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

  1. BZOJ1251 序列终结者

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

  2. BZOJ 1251: 序列终结者( splay )

    先orz一下clj...我的splay跟着他写的... 这道题很普通的splay我调了这么久 T T , 就是因为 null 的值初始化为0 , 结果就挂了... ------------------ ...

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

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

  4. BZOJ1251: 序列终结者

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

  5. BZOJ 1251 序列终结者 Splay

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

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

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

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

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

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

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

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

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

最新文章

  1. python的烦恼_还在为每天忘记签到而烦恼吗?python来帮你搞定!
  2. 《消逝的光芒》为何能成为Steam热销榜常客 ?
  3. ubuntu20.04运行海商王2
  4. ABAP事务码SAT里的Gross time and net time
  5. 并行编程2——多核体系架构
  6. 若川邀你进 源码共读 群~长期交流学习
  7. 用filter求素数
  8. 手机python编程文件如何转文档_Python 开发者面向文档编程的正确姿势
  9. 跨界造智能机器人,娃哈哈能“喝”出新辉煌吗
  10. 软件测试基础知识大全(新手入门必备)
  11. 短视频源码开启“短视频+”
  12. OFDM系统中的信号检测算法分类和详解
  13. 小程序scroll-view文字不能自动换行
  14. 用python画一个机器猫歌词_用Python语言模型和LSTM做一个Drake饶舌歌词生成器
  15. 什么是机器学习里的优化?
  16. P2P的资金托管方式 参考
  17. 微服务架构开发实战:如何集成Zuul和实现API网关?
  18. Linux驱动加载实例
  19. Android开发 自定义心率图
  20. 计算机一级2017.6,2017年全国计算机一级考试真题

热门文章

  1. Linux环境编译安装Mysql以及PHP中文乱码解决
  2. 好多Javascript日期选择器呀-7
  3. Web的桌面提醒(Popup)
  4. K-均值聚类(K-Means) C++代码实现
  5. Caffe中Layer注册机制
  6. Windows Caffe中MNIST数据格式转换实现
  7. 【C++】C++11 STL算法(三):分隔操作(Partitioning operations)、排序操作(Sorting operations)
  8. accp8.0html作业,Accp8.0HTML标签
  9. mytag.class.php,织梦CMS/dedecms织梦模板留言板调用{dede:}标签的头部尾部的方法
  10. forall分批提交oracle,使用BULK COLLECT+FORALL加速批量提交