• hiho #1329 平衡树·Splay


    #1329 : 平衡树·Splay

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    小Ho:小Hi,上一次你跟我讲了Treap,我也实现了。但是我遇到了一个关键的问题。

    小Hi:怎么了?

    小Ho:小Hi你也知道,我平时运气不太好。所以这也反映到了我写的Treap上。

    小Hi:你是说你随机出来的权值不太好,从而导致结果很差么?

    小Ho:就是这样,明明一样的代码,我的Treap运行结果总是不如别人。小Hi,有没有那种没有随机因素的平衡树呢?

    小Hi:当然有了,这次我就跟你讲讲一种叫做Splay的树吧。而且Splay树能做到的功能比Treap要更强大哦。

    小Ho:那太好了,你快告诉我吧!

    提示:Splay

    输入

    第1行:1个正整数n,表示操作数量,100≤n≤200,000

    第2..n+1行:可能包含下面3种规则:

    1个字母'I',紧接着1个数字k,表示插入一个数字k到树中,1≤k≤1,000,000,000,保证每个k都不相同

    1个字母'Q',紧接着1个数字k。表示询问树中不超过k的最大数字

    1个字母'D',紧接着2个数字a,b,表示删除树中在区间[a,b]的数。

    输出

    若干行:每行1个整数,表示针对询问的回答,保证一定有合法的解

    样例输入
    6
    I 1
    I 2
    I 3
    Q 4
    D 2 2
    Q 2
    样例输出
    3
    1

    AC代码:
     1 #include "iostream"
     2 #include "set"
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int n, k;
     8     set<int> s;
     9     char c;
    10 
    11     cin >> n;
    12     while (n--)
    13     {
    14         cin >> c >> k;
    15         if (c == 'I')
    16             s.insert(k);
    17         else if (c == 'Q')
    18         {
    19             set<int>::iterator  it = s.upper_bound(k);
    20             it--;
    21             cout << *it << endl;
    22         }
    23         if (c == 'D')
    24         {
    25             int r;
    26             cin >> r;
    27             s.erase(s.lower_bound(k), s.upper_bound(r));
    28         }
    29     }
    30 }

    erase(a,b)函数,擦除区间a,b

  • 相关阅读:
    看过的代码
    ScipyLectures-simple学习笔记
    机器学习1一个月2017/11/24-2017/12/24
    机器学习课程 matlab 练习
    win7 win8 快捷键直接调出任务管理器
    java 关于getProperty()方法中反斜杠问题
    把myeclipse中html/jsp文件的视图调到只看代码
    Win7 server2008 共享文件夹 不输入网络密码
    别用visual editor了,用WindowBuilder
    visual editor ve1.5下载
  • 原文地址:https://www.cnblogs.com/SeekHit/p/5641111.html
Copyright © 2020-2023  润新知