1、题目大意:维护序列,只有区间翻转这个操作

2、分析:splay的经典操作就是实现区间翻转,就是在splay中有一个标记,表示这个区间被翻转了

然后就是记得各种的操作访问某个点时,记得下传,顺便交换一下左右子树的左右子树(我语文不好

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
struct Node{
    Node *ch[2];
    int f, v, s;
    int cmp(int x){
        if(x < v) return 0;
        else if(x == v) return -1;
        else return 1;
    }
    int cmp1(int x){
        int k = 1;
        if(ch[0]) k += ch[0] -> s;
        if(x < k) return 0;
        else if(x == k) return -1;
        else if(x > k) return 1;
    }
    void maintain(){
        s = 1;
        if(ch[0]) s += ch[0] -> s;
        if(ch[1]) s += ch[1] -> s;
    }
    void pushdown(){
        if(f == 1){
            if(ch[0] != NULL){
                ch[0] -> f ^= 1;
                swap(ch[0] -> ch[0], ch[0] -> ch[1]);
            }
            if(ch[1] != NULL){
                ch[1] -> f ^= 1;
                swap(ch[1] -> ch[0], ch[1] -> ch[1]);
            }
            f = 0;
        }
    }
};
struct splay_tree{
    Node ft[2000000];
    Node *root;
    int a[200000], tot;
    void rotate(Node* &o, int d){
        Node *k = o -> ch[d ^ 1];
        k -> pushdown();
        o -> ch[d ^ 1] = k -> ch[d];
        k -> ch[d] = o;
        o -> maintain();
        k -> maintain();
        o = k;
    }
    void splay(Node* &o, int k){
        if(!o) return;
        o -> pushdown();
        if(o -> ch[0]) o -> ch[0] -> pushdown();
        if(o -> ch[1]) o -> ch[1] -> pushdown();
        int d = o -> cmp1(k);
        if(d == 1 && o -> ch[0]) k = k - o -> ch[0] -> s - 1;
        else if(d == 1) k --;
        if(d != -1){
            Node* w = o -> ch[d];
            int d2 = w -> cmp1(k);
            int k2 = k;
            if(d2 == 1){
                k2 --;
                if(w -> ch[0]) k2 -= w -> ch[0] -> s;
            }
            if(d2 != -1){
                splay(w -> ch[d2], k2);
                if(d == d2) rotate(o, d ^ 1);
                else rotate(o -> ch[d], d);
            }
            rotate(o, d ^ 1);
        }
        return;
    }
    Node* merge(Node *left, Node *right){
        if(left == NULL) return right;
        if(right == NULL) return left;
        splay(left, left -> s);
        left -> ch[1] = right;
        left -> maintain();
        return left;
    }
    void split(Node* &o, int k, Node* &left, Node* &right){
        if(k == 0){
            left = NULL;
            right = o;
            return;
        }
        splay(o, k);
        left = o;
        right = o -> ch[1];
        left -> ch[1] = NULL;
        left -> maintain();
        return;
    }
    void flip(int l, int r){
        Node *left, *mid, *right;
        split(root, l - 1, left, mid);
        split(mid, r - l + 1, mid, right);
        swap(mid -> ch[0], mid -> ch[1]);
        mid -> f ^= 1;
        root = merge(left, merge(mid, right));
    }
    int value(int l){
        Node *left, *mid, *right;
        split(root, l - 1, left, mid);
        split(mid, 1, mid, right);
        int ret = mid -> v;
        root = merge(left, merge(mid, right));
        return ret;
    }
    void insert(Node* &o, int l, int r){
        if(r < l) return;
        int mid = (l + r) / 2;
        o = &ft[tot]; tot ++;
        o -> ch[0] = o -> ch[1] = NULL;
        o -> v = mid;
        o -> f = 0;
        if(l != r){
            insert(o -> ch[0], l, mid - 1);
            insert(o -> ch[1], mid + 1, r);
        }
        o -> maintain();
        return;
    }
} wt;
int main(){
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i ++) wt.a[i] = i;
    wt.insert(wt.root, 1, n);
    for(int i = 1; i <= m; i ++){
        int l, r;
        scanf("%d%d", &l, &r);
        wt.flip(l, r);
    }
    for(int i = 1; i <= n; i ++){
        printf("%d ", wt.value(i));
    }
    return 0;
}

BZOJ3223——Tyvj 1729 文艺平衡树的更多相关文章

  1. [BZOJ3223]Tyvj 1729 文艺平衡树

    [BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...

  2. BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

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

  3. bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)

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

  4. 2018.08.05 bzoj3223: Tyvj 1729 文艺平衡树(非旋treap)

    传送门 经典的平衡树问题,之前已经用splay写过一次了,今天我突发奇想,写了一发非旋treap的版本,发现挺好写的(虽然跑不过splay). 代码: #include<bits/stdc++. ...

  5. bzoj3223: Tyvj 1729 文艺平衡树 splay裸题

    splay区间翻转即可 /************************************************************** Problem: 3223 User: walf ...

  6. 【Splay】bzoj3223 Tyvj 1729 文艺平衡树

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #i ...

  7. BZOJ3223: Tyvj 1729 文艺平衡树 无旋Treap

    一开始光知道pushdown却忘了pushup......... #include<cstdio> #include<iostream> #include<cstring ...

  8. 【Splay】【块状链表】bzoj3223 Tyvj 1729 文艺平衡树

    让蒟蒻见识到了常数大+滥用STL的危害. <法一>很久之前的Splay #include<cstdio> #include<algorithm> using nam ...

  9. BZOJ 3223: Tyvj 1729 文艺平衡树

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

随机推荐

  1. JavaScript---认识JavaScipt

    认识JavaScript 1.什么是JavaScript? JavaScript是属于网络的脚本语言,她被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies以及更多的应用,她更是因特 ...

  2. BZOJ4527: K-D-Sequence 线段树

    别人家的题解. #include<bits/stdc++.h> #define N 200005 #define M (l+r>>1) #define P (k<< ...

  3. BZOJ3685: 普通van Emde Boas树

    显然这题的所有操作都可以用set,但是直接用set肯定要T,考虑到读入量较大,使用fread读入优化,就可以卡过去了. #include<bits/stdc++.h> using name ...

  4. C#中值类型和引用类型图解

    举几个值类型和引用类型的内存配置: 值类型存储在栈中,引用类型堆里: 1,数组 数组是引用类型,但是数组的元素可以是值类型或引用类型 2. 结构 结构是值类型,简略的看个例子 struct sampl ...

  5. Windows10安装MongoDB

    环境:Windows10x64,mongodb-win32-x86_64-2008plus-ssl-3.2.9-signed.msi 步骤: 安装msi文件到D:\ 新建配置文件mongo.confi ...

  6. JQuery------$.getJSON()方法的使用

    html(../Home/Index.cshtml) <body> <button class="Btn">按钮</button> </b ...

  7. JQuery------$.ajax()的使用方法

    菜鸟教程地址: http://www.runoob.com/jquery/ajax-ajax.html html(../Home/Index.cshtml) <body> <butt ...

  8. Maven环境变量配置

    Maven 3.0.4版本下载地址: http://www.apache.org/dyn/closer.cgi?path=/maven/binaries/apache-maven-3.0.4-bin. ...

  9. Centos 6.0将光盘作为yum源的设置方法

    在使用Centos 的时候,用yum来安装软件包是再方便不过了,但是如果在无法连接互联网的情况下,yum就不好用了. 下面介绍一种方式,就是将Centos安装光盘作为yum源,然后使用yum来安装软件 ...

  10. Javascript权威指南——第一章Javascript概述

    示例:javascript贷款计算器 相关技术: 1.如何在文档中查找元素: 2.如何通过表单input元素来获取用户的输入数据: 3.如何通过文档元素来设置HTML内容: 4.如何将数据存储在浏览器 ...