裸的splay

今儿写的splay,由于自己刚开始学,发现几个容易漏掉的地方

1:开始给所有的儿子赋值为-1

2:给max[-1]赋值为-maxlongint

3:开始father[root]:=sroot

4:在find和rotate中的push_down

5:数组的下边界为-1

6:push_down中要给标签清空

7:build中要给tree数组赋值

8:rotate操作不熟悉

由于不熟悉,发现的问题有很多,以后多加练习就好了

/**************************************************************
    Problem:
    User: BLADEVIL
    Language: Pascal
    Result: Accepted
    Time: ms
    Memory: kb
****************************************************************/
 
//By BLADEVIL
const
    sroot                           =-;
     
var
    n, m                            :longint;
    x, y                            :longint;
    a                               :array[-..] of longint;
    tree, size, father              :array[-..] of longint;
    son                             :array[-..,..] of longint;
    flag                            :array[-..] of boolean;
    root                            :longint;
    i                               :longint;
     
procedure swap(var a,b:longint);
var
    c                               :longint;
begin
    c:=a; a:=b; b:=c;
end;
     
procedure update(x:longint);
begin
    size[x]:=size[son[x,]]+size[son[x,]]+;
end;
     
procedure renew_reverse(x:longint);
begin
    swap(son[x,],son[x,]);
    flag[x]:=not flag[x];
end;
 
procedure push_down(x:longint);
var
    l, r                            :longint;
begin
    l:=son[x,]; r:=son[x,];
    if flag[x] then
    begin
        if l<>- then renew_reverse(l);
        if r<>- then renew_reverse(r);
        flag[x]:=false;
    end;
end;
     
function build(l,r:longint):longint;
var
    mid                             :longint;
begin
    mid:=(l+r) div ;
    build:=mid;
    tree[mid]:=a[mid];
    if mid->=l then
    begin
        son[mid,]:=build(l,mid-);
        father[son[mid,]]:=mid;
    end;
    if mid+<=r then
    begin
        son[mid,]:=build(mid+,r);
        father[son[mid,]]:=mid;
    end;
    update(mid);
end;
 
function find(x:longint):longint;
var
    t                               :longint;
begin
    t:=root;
    while true do
    begin
        push_down(t);
        if size[son[t,]]+=x then exit(t);
        if size[son[t,]]+>x then t:=son[t,] else
        begin
            dec(x,size[son[t,]]+);
            t:=son[t,];
        end;
    end;
end;
 
procedure rotate(x,y:longint);
var
    f                               :longint;
begin
    push_down(x);
    f:=father[x];
    son[f,y]:=son[x,y xor ];
    father[son[x,y xor ]]:=f;
    if f=root then root:=x else
        if f=son[father[f],] then
            son[father[f],]:=x else
            son[father[f],]:=x;
    father[x]:=father[f];
    father[f]:=x;
    son[x,y xor ]:=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],])) else
        begin
            if x=son[father[x],] then u:= else u:=-;
            if father[x]=son[father[father[x]],] then v:= else v:=-;
            if u*v= then
            begin
                rotate(father[x],ord(x=son[father[x],]));
                rotate(x,ord(x=son[father[x],]));
            end else
            begin
                rotate(x,ord(x=son[father[x],]));
                rotate(x,ord(x=son[father[x],]));
            end;
        end;
    end;
    update(x);
end;
     
procedure reverse(l,r:longint);
var
    p                               :longint;
begin
    p:=find(l); splay(p,sroot);
    p:=find(r+); splay(p,root);
    p:=son[son[root,],];
    renew_reverse(p);
end;
     
begin
    fillchar(son,sizeof(son),);
    read(n,m);
    for i:= to n do a[i]:=i;
    inc(n);
    root:=build(,n);
    father[root]:=sroot;
    for i:= to m do
    begin
        read(x,y);
        reverse(x,y);
    end;
    for i:= to n do write(find(i),' '); writeln;
end.   

bzoj 3223 裸splay的更多相关文章

  1. bzoj 1251 裸splay

    裸的splay,只需要注意 max[-1]:=-maxlongint 就行了,否则在update的时候子节点的 max值会在max[-1]里选 /*************************** ...

  2. 【splay】文艺平衡树 BZOJ 3223

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3  ...

  3. [BZOJ 3223 & Tyvj 1729]文艺平衡树 & [CodeVS 3243]区间翻转

    题目不说了,就是区间翻转 传送门:BZOJ 3223 和 CodeVS 3243 第一道题中是1~n的区间翻转,而第二道题对于每个1~n还有一个附加值 实际上两道题的思路是一样的,第二题把值对应到位置 ...

  4. BZOJ 3223 Tyvj 1729 文艺平衡树(Splay)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3223 [题目大意] 给出一数列,问m次区间翻转后的结果. [题解] Splay 区间翻 ...

  5. bzoj 3223 文艺平衡树 - Splay

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3884  Solved: 2235[Submit][Sta ...

  6. BZOJ 3223: Tyvj 1729 文艺平衡树(splay)

    速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...

  7. bzoj 3223: Tyvj 1729 文艺平衡树 (splay)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面: 3223: Tyvj 1729 文艺平衡树 Time Limit: 10 S ...

  8. BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6881  Solved: 4213[Submit][Sta ...

  9. BZOJ 3223 Splay区间翻转

    思路: 区间翻转的裸题 终于tm理解splay了-- //By SiriusRen #include <cstdio> #include <cstring> #include ...

随机推荐

  1. github 初始化操作小记

     Git作为一种越来越重要的工具,github又如此流行,现在就简单记录一下git的基础操作,希望能帮助大家快速体验入门! 1 查看本地是否存在”公钥”和”私钥” 如果没有,则执行: ssh-keyg ...

  2. 【性能监控】虚拟内存监控命令vmstat详解

    一.Vmstat说明 vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.vmstat 工具提供了一种低开销的系 ...

  3. you need to resolve your current index first 已解决

    从一个分支A切换到另一个分支B后,对切换后的B分支进行pull操作,因为pull操作实际上包含了fetch+merge操作,在执行 merge操作时,由于很长时间没有对B分支执行过pull/merge ...

  4. python基础训练营06

    任务六 时长: 啥是佩奇代码复现 参考链接:https://mp.weixin.qq.com/s/whtJOrlegpWzgisYJabxOg 画一只佩奇: 代码: from turtle impor ...

  5. day-10 sklearn库实现SVM支持向量算法

    学习了SVM分类器的简单原理,并调用sklearn库,对40个线性可分点进行训练,并绘制出图形画界面. 一.问题引入 如下图所示,在x,y坐标轴上,我们绘制3个点A(1,1),B(2,0),C(2,3 ...

  6. HDU 4757 Tree(可持久化字典树)(2013 ACM/ICPC Asia Regional Nanjing Online)

    Problem Description   Zero and One are good friends who always have fun with each other. This time, ...

  7. linux中升级安装python2.7

    打算自建VPN,新购买了一个虚拟服务器,centOS6.6 自带的是python2.6,因为比较习惯python2.7,所以就升级到最新的python2.7.12 首先要安装:sudo yum ins ...

  8. Linux之JDK在线安装及配置

    1.查找java相关得列表  yum -y list java*2.在线安装 yum -y install java-1.6.0-openjdk*3.查看安装目录  ls -l /usr/lib/jv ...

  9. 关于如何利用原生js动态给一个空对象添加属性以及属性值

    首先,回忆一下,访问对象属性一共有两种方法:点获取法和方括号获取法.而我们最常用的就是点获取法了.但是当我们遇到需要给对象动态添加属性和属性值时,点获取法好像就不太好用了,尤其是我们不知道属性名的时候 ...

  10. Hibernate基本演示

    保存一个对象到数据库中 目录结构 hibernate.cfg.xml <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hi ...