博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1251: 序列终结者 (splay)
阅读量:6502 次
发布时间:2019-06-24

本文共 3058 字,大约阅读时间需要 10 分钟。

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

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

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

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

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

{
$inline on}{
$M 1000000000,0,maxlongint}const //mm=maxlongint>>2; maxn=60000; var size,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;begin inc(tot); exit(tot);end; function mmax(x,y:longint):longint;inline;begin if x
0 then begin value[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;begin pushdown(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;var u,k:longint; flag:boolean;begin pushdown(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;var u,k:longint; flag:boolean;begin pushdown(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;begin while fa[x]<>u do begin if fa[fa[x]]=u then begin if left[fa[x]]=x then rt(fa[x]) else lt(fa[x]); exit; end; if left[fa[x]]=x then begin if left[fa[fa[x]]]=fa[x] then rt(fa[fa[x]]); rt(fa[x]); end else begin if right[fa[fa[x]]]=fa[x] then lt(fa[fa[x]]); lt(fa[x]); end; end;end; function find(x,y:longint):longint;inline;begin pushdown(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;var now:longint;begin now:=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;var mid,x:longint;begin mid:=(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 begin if (l=0) or (l=n+1) then value[x]:=-maxlongint>>1; max[x]:=value[x]; exit(x); end; if l
0 do begin dec(m); read(j); if j=1 then begin readln(j,k,l); x:=change(j,k); inc(mark[left[x]],l); update(x); update(root); end else if j=2 then begin readln(j,k); x:=change(j,k); rev[left[x]]:=rev[left[x]] xor true; update(x); update(root); end else begin readln(j,k); x:=change(j,k); writeln(max[left[x]]); end; end;end.
View Code

 

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

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

你可能感兴趣的文章
关于网站的一些js和css常见问题的记录
查看>>
zabbix-3.4 触发器
查看>>
换用代理IP的Webbrowser方法
查看>>
【视频编解码·学习笔记】7. 熵编码算法:基础知识 & 哈夫曼编码
查看>>
spark集群安装部署
查看>>
MySql 查询表字段数
查看>>
mariadb 内存占用优化
查看>>
Centos7安装编译安装zabbix2.219及mariadb-5.5.46
查看>>
怎么获得combobox的valueField值
查看>>
Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数
查看>>
浅谈网络协议(四) IP的由来--DHCP与PXE
查看>>
jre与jdk的区别
查看>>
全景图的种类
查看>>
git 维护
查看>>
jfinal框架下使用c3P0连接池连接sql server 2008
查看>>
Jfinal Generator 不需要生成带某个前缀的表名数组的方法
查看>>
struts2中使用标签操作静态方法等
查看>>
熬夜写了一个小游戏,向SpaceX聊表敬意
查看>>
身份证工具类
查看>>
JPA增删改查,
查看>>