裸的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. 国际电话区号SQL

    CREATE TABLE `phone_prefix` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `country` varchar(30) N ...

  2. QC的使用学习(三)

    一.需求转换测试 1.自动转换方法: (1)将最底层的子需求转换成设计步骤:即将最底层的子要求转换成测试用例的步骤. (2)将最底层的子要求转换成测试:即将最底层的要求转换成单个测试用例(建议使用) ...

  3. 常用模块(数据序列化 json、pickle、shelve)

    本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...

  4. Tuxedo 介绍与安装

    Tuxedo 介绍与安装(一) Tuxedo介绍                                                                             ...

  5. 【java并发编程实战】第七章:取消与关闭

    停止线程的几种方式 一般的逻辑停止 public class ThreadInterruptTest { public static volatile boolean cancel = true; p ...

  6. docker容器中启动kvm虚拟机

    .安装docker yum install docker systemctl start docker.service systemctl enable docker.service .拉取cento ...

  7. 机器学习性能指标精确率、召回率、F1值、ROC、PRC与AUC--周振洋

    机器学习性能指标精确率.召回率.F1值.ROC.PRC与AUC 精确率.召回率.F1.AUC和ROC曲线都是评价模型好坏的指标,那么它们之间有什么不同,又有什么联系呢.下面让我们分别来看一下这几个指标 ...

  8. [PocketFlow]解决在coco上mAP非常低的bug

    1.问题 继上次训练挂起的bug后,又遇到了现在评估时AP非常低的bug.具体有多低呢?Pelee论文中提到,用128的batchsize大小在coco数据集上训练70K次迭代后,AP@0.5:0.9 ...

  9. pexpect获取远端命令执行结果

    类比于shell的expect, python中使用pexpect模块来模拟用户和终端交互.有的时候使用pexpect.sendline发送命令后,在各种条件影响下, 可能并不能保证命令在远端服务器执 ...

  10. Android—实现科大讯飞语音合成

    背景(可以不看) 实验室项目开发的APP需要有语音提示功能,之前的做法是人工录音,剪辑片段,调用Android的多媒体,播放,呵呵呵,,,这是21世纪!这样肯定显得有点low啊,且不说档次,应用场景也 ...