bzoj 1251 裸splay
裸的splay,只需要注意 max[-1]:=-maxlongint 就行了,否则在update的时候子节点的
max值会在max[-1]里选
/**************************************************************
Problem: 1251
User: BLADEVIL
Language: Pascal
Result: Accepted
Time:16008 ms
Memory:3448 kb
****************************************************************/
//By BLADEVIL
const
sroot =-1;
var
n, m :longint;
i :longint;
a, father :array[-1..100010] of longint;
k, l, r, v :longint;
root :longint;
max, size, tree :array[-1..100010] of longint;
val :array[-1..100010] of longint;
flag :array[-1..100010] of boolean;
son :array[-1..100010,0..1] of longint;
procedure swap(var a,b:longint);
var
c :longint;
begin
c:=a; a:=b; b:=c;
end;
function get_max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end;
procedure renew_add(x,v:longint);
begin
inc(tree[x],v); inc(val[x],v); inc(max[x],v);
end;
procedure renew_reverse(x:longint);
begin
swap(son[x,1],son[x,0]);
flag[x]:=not flag[x];
end;
procedure update(x:longint);
begin
//if x=sroot then exit;
max[x]:=get_max(tree[x],get_max(max[son[x,1]],max[son[x,0]]));
size[x]:=size[son[x,1]]+size[son[x,0]]+1;
end;
function build(l,r:longint):longint;
var
mid :longint;
begin
mid:=(r+l) div 2;
build:=mid;
tree[mid]:=a[mid];
if l+1<=mid then
begin
son[mid,0]:=build(l,mid-1);
father[son[mid,0]]:=mid;
end;
if mid<=r-1 then
begin
son[mid,1]:=build(mid+1,r);
father[son[mid,1]]:=mid;
end;
update(mid);
end;
procedure push_down(x:longint);
var
l, r :longint;
begin
l:=son[x,0]; r:=son[x,1];
if flag[x] then
begin
if l<>-1 then renew_reverse(l);
if r<>-1 then renew_reverse(r);
flag[x]:=false;
end;
if val[x]<>0 then
begin
if l<>-1 then renew_add(l,val[x]);
if r<>-1 then renew_add(r,val[x]);
val[x]:=0;
end;
end;
function find(x:longint):longint;
var
t :longint;
begin
t:=root;
while true do
begin
push_down(t);
if size[son[t,0]]+1=x then exit(t);
if size[son[t,0]]+1>x then t:=son[t,0] else
begin
dec(x,size[son[t,0]]+1);
t:=son[t,1];
end;
end;
end;
procedure rotate(x,y:longint);
var
f :longint;
begin
push_down(x);
f:=father[x];
father[son[x,y xor 1]]:=f;
son[f,y]:=son[x,y xor 1];
if f=root then root:=x else
if f=son[father[f],0] then
son[father[f],0]:=x else
son[father[f],1]:=x;
father[x]:=father[f];
father[f]:=x;
son[x,y xor 1]:=f;
update(f);
update(x);
end;
procedure splay(x,y:longint);
var
u, v :longint;
begin
while father[x]<>y do
begin
if father[father[x]]=y then
rotate(x,ord(x=son[father[x],1])) else
begin
if son[father[x],0]=x then u:=1 else u:=-1;
if son[father[father[x]],0]=father[x] then v:=1 else v:=-1;
if u*v=1 then
begin
rotate(father[x],ord(x=son[father[x],1]));
rotate(x,ord(x=son[father[x],1]));
end else
begin
rotate(x,ord(x=son[father[x],1]));
rotate(x,ord(x=son[father[x],1]));
end;
end;
end;
update(x);
end;
procedure add(l,r,v:longint);
var
p :longint;
begin
p:=find(l);splay(p,sroot);
p:=find(r+2);splay(p,root);
p:=son[son[root,1],0];
renew_add(p,v);
end;
procedure reverse(l,r:longint);
var
p :longint;
begin
p:=find(l);splay(p,sroot);
p:=find(r+2);splay(p,root);
p:=son[son[root,1],0];
renew_reverse(p);
end;
function ask_max(l,r:longint):longint;
var
p :longint;
begin
p:=find(l); splay(p,sroot);
p:=find(r+2); splay(p,root);
p:=son[son[root,1],0];
ask_max:=max[p];
end;
begin
fillchar(son,sizeof(son),255);
read(n,m);
max[-1]:=-maxlongint;
for i:=1 to n do a[i]:=0;
inc(n);
root:=build(0,n);
father[root]:=sroot;
for i:=1 to m do
begin
read(k);
if k=1 then
begin
read(l,r,v);
add(l,r,v);
end else
begin
read(l,r);
if k=2 then
reverse(l,r) else
writeln(ask_max(l,r));
end;
end;
end.
bzoj 1251 裸splay的更多相关文章
- bzoj 3223 裸splay
裸的splay 今儿写的splay,由于自己刚开始学,发现几个容易漏掉的地方 1:开始给所有的儿子赋值为-1 2:给max[-1]赋值为-maxlongint 3:开始father[root]:=sr ...
- BZOJ 1251 序列终结者(Splay)
题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术 ...
- BZOJ 1251: 序列终结者 [splay]
1251: 序列终结者 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3778 Solved: 1583[Submit][Status][Discu ...
- BZOJ 1251 Splay维护序列
思路: splay维护序列的裸题 啊woc调了一天 感谢yzy大佬的模板-- //By SiriusRen #include <cstdio> #include <cstring&g ...
- 序列终结者 BZOJ 1251 Splay
题目背景 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术 ...
- bzoj 1251序列终结者 splay 区间翻转,最值,区间更新
序列终结者 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 4594 Solved: 1939[Submit][Status][Discuss] De ...
- BZOJ 1251: 序列终结者
1251: 序列终结者 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 3773 Solved: 1579 [Submit][Status][Dis ...
- bzoj 1251: 序列终结者 平衡树,fhqtreap
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1251 思路 好简单的模板题 不过还是wrong了好几发 叶子节点要注意下,不能使用 遇到就不 ...
- bzoj 1588 平衡树 splay
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 15446 Solved: 6076[Submit][Sta ...
随机推荐
- C++学习008-delete与delete[]的差别
对于简单的数据类型,delete与delete[]是没啥差别的,就是等价的 例如 int main() { int *pdata = new int[20]; delete pdata; //dele ...
- 护网杯 three hit 复现(is_numeric引发的二次注入)
1.题目源码 https://github.com/ZhangAiQiang/three-hit 题目并不真的是当时源码,是我根据做法自己写的,虽然代码烂,但是还好能达到复现的目的 ,兄弟们star一 ...
- Java并发基础--线程安全
一.线程安全 1.线程安全的概念 线程安全:某个类被单个线程,或者多个线程同时访问,所表现出来的行为是一致,则可以说这个类是线程安全的. 2.什么情况下会出现线程安全问题 在单线程中不会出现线程安全问 ...
- 问题 C: Goldbach's Conjecture
题目描述 Goldbach's Conjecture: For any even number n greater than or equal to 4, there exists at least ...
- python第一天(安装运行python)
1. 安装Python 3.7 目前,Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的.由于3.x版越来越普及,我们的教程将以最新的Python 3.7版本为基础.请确保你 ...
- DFS——CodeForces740DAlyona and a tree
一.题目回顾 题目链接:Alyona and a tree Examples Input 52 5 1 4 61 71 13 53 6 Output 1 0 1 0 0 Input 59 7 8 ...
- DPDK Qos之报文处理流水线
原创翻译,转载请注明出处. 下面是一个支持Qos的复杂报文处理流水线的图: 流水线是通过DPDP可重用的软件库构建出来的.在流水线里实现QoS主要是如下模块:policer,dropper,shced ...
- linux cfs 负载均衡
确定新的负载的时候,代码中给出的公式是: (old×(2^i-1) + new))/2^i 整理下来是: old + (new-old)/2^i i的范围是[1, 4],也就是说,i的层级越高,那么n ...
- java生成唯一的id编号
GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随即数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义 ...
- 关于HTML中的object元素
<object>元素:它主要用于定义网页中的多媒体,比如音频,视频,Java applets,PDF,Active和Flash.object标签内除了param标签外,其他的内容将在浏览器 ...