GNU order-statistics-tree的意外结果

时间:2018-05-26 03:51:15

标签: c++ gcc data-structures gnu gcc-extensions

我刚刚学到了一些基于GNU策略的数据结构。但是我在这个问题上得到了一些意想不到的结果:(原版用中文描述,所以我翻译过了。)

您需要编写支持以下操作的数据结构:

  1. 插入号码x
  2. 删除号码x
  3. 查找号码x的订单(“订单”指的是小于此号码的元素数量+ 1)
  4. 查找订单为x
  5. 的号码
  6. 查找号码x的前缀
  7. 查找号码x的后缀
  8.    
         #include <iostream>
         #include <vector>
         #include <ext/pb_ds/assoc_container.hpp>
         #include <ext/pb_ds/tree_policy.hpp>
         #include <set>
    
         using namespace std;
         using ost = __gnu_pbds::tree<
                                int,
                                __gnu_pbds::null_type,
                                less<int>,
                                __gnu_pbds::rb_tree_tag,
                                __gnu_pbds::tree_order_statistics_node_update>;
    
    int a;
    int main() {
        ost s;
        int n;
        cin>>n;
        int opnum;
        ost::iterator i;
        for(int j=1;j<=n;j++)
        {
            cin>>opnum;
            switch(opnum)
            {
    
                case 1:
                    cin>>a;
                    s.insert(a);
                    break;
                case 2:
                    cin>>a;
                    s.erase(a);
                    break;
                case 3:
                    cin>>a;
                    cout<<s.order_of_key(a)+1<<endl;
                    break;
                case 4:
                    cin>>a;
                    cout<<*s.find_by_order(a-1)<<endl;
                    break;
                case 5:
                    cin>>a;
                    i=s.lower_bound(a);
                    --i;
                    while(a<=*i)
                        --i;
                    cout<<*i<<endl;
                    break;
                case 6:
                    cin>>a;
                    cout<<*(s.upper_bound(a))<<endl;
                    break;
            }
            /*
            for(auto i:s)
            {
                cout<<"\t"<<i<<endl;
            }
            */
    
        }
        return 0;
    }
    

    但只有55%的数据点被接受。在错误的答案点,数百行之后会出现问题。所以它一定是一个非常小的问题。你能搞清楚吗?我将非常感激。

    我对意外结果的了解是,它们通常大于预期的结果。但是,当程序输出7时,它需要6。所以我真的很困惑。我甚至不知道问题发生在哪个case剂量。

    此外,数据点保证是正确的。我自己写了Treap来检查它。

    修改

    数据范围:

    操作限制:100000次 数字限制:每个数字都在[-10000000,10000000]

0 个答案:

没有答案