求助:一个初值差别引起的巨大时间差???
  • 板块学术版
  • 楼主bear_xin
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/7/29 21:52
  • 上次更新2023/11/4 12:43:37
查看原帖
求助:一个初值差别引起的巨大时间差???
393433
bear_xin楼主2021/7/29 21:52

这里是题目 但是其实应该和splayTree没关系?(球球不要嫌麻烦就划走)。 问题就是:val[0]和val[n+1]的初值负值为0x3f3f3f3f就超时,但是负值为2000000000就过了,就离谱????明明和初值没有任何关系。大家可以把main函数里的初值改一改,时间差大的离谱???想知道到底有什么问题??

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <ctime>
#include <iostream>
using namespace std;

///-------------------------------------------------------常用规定部分
#define inf_ 2000000000
//----------------------其它
const int maxN_ = 200007;
const int maxM_ = 1e4+10;
///-------------------------------------------------------变量声明部分
//--------------------------------------其它
int val[maxN_], n, m;

struct SPLAY_TREE
{

#define lson s[x].son[0]
#define rson s[x].son[1]
    struct data
    {
        int val, siz, son[2], fa, cnt;
    } s[maxN_ * 10];
    int tot, root;
    inline int NewNode()
    {
        s[++tot].cnt = 1;
        return tot;
    }
    inline int Which(int x)
    {
        return s[s[x].fa].son[1] == x;
    }
    inline void PushUp(int x)
    {
        s[x].siz = s[lson].siz + s[rson].siz + s[x].cnt;
    }

    inline void Rotate(int x)
    {
        int fa = s[x].fa, ffa = s[fa].fa, op = Which(x);
        s[fa].son[op] = s[x].son[op ^ 1];
        if (s[fa].son[op])
            s[s[fa].son[op]].fa = fa;
        s[x].son[op ^ 1] = fa, s[fa].fa = x, s[x].fa = ffa;
        if (ffa)
            s[ffa].son[s[ffa].son[1] == fa] = x;
        PushUp(fa), PushUp(x);
    }
    void Splay(int x, int &tar)
    {
        for (int u = s[tar].fa, fa; (fa = s[x].fa) != u; Rotate(x))
            if (s[fa].fa != u)
                Rotate(Which(fa) == Which(x) ? fa : x);
        tar = x;
    }
    void Build(int l, int r, int &x)
    {
        x = NewNode();
        int mid = (l + r) >> 1;
        s[x].val = val[mid];
        if (mid > l)
            Build(l, mid - 1, lson), s[lson].fa = x;
        if (r > mid)
            Build(mid + 1, r, rson), s[rson].fa = x;
        PushUp(x);
    }
    void Insert(int &x, int fa, int val)
    {

        if (!x)
            x = NewNode(), s[x].fa = fa, s[x].val = val;
        else if(s[x].val == val)
            s[x].cnt++;
        else
            Insert(s[x].son[val > s[x].val], x, val);
        PushUp(x);
    }
    int Find(int x, int val)
    {
        if (s[x].val == val)
            return x;
        else
            return Find(s[x].son[val > s[x].val], val);
    }
    int GetPre(int x, int val)
    {
        if (!x)
            return 0;
        if (s[x].val < val)
        {
            int a = x, b = GetPre(rson, val);
            return b == 0 ? a : b;
        }
        else
            return GetPre(lson, val);
    }
    int GetNext(int x, int val)
    {
        if (!x)
            return 0;
        if (s[x].val > val)
        {
            int a = x, b = GetNext(lson, val);
            return b == 0 ? a : b;
        }
        else
            return GetNext(rson, val);
    }
    void Delete(int val)
    {
        int x = Find(root, val), l, r;
        if(x && s[x].cnt > 1)
        {
            s[x].cnt--;
            Splay(x, root);
            return ;
        }
        Splay(x, root), l = lson, r = rson;
        while (s[l].son[1])
            l = s[l].son[1];
        Splay(l, s[x].son[0]);
        s[r].fa = l, s[l].fa = 0, s[l].son[1] = r, PushUp(l), root = l;
    }
    int Getrank(int val)
    {
        int x = GetPre(root, val);
        Splay(x, root);
        return s[lson].siz+s[x].cnt;
    }
    int Getnum(int x, int kth)
    {
        if (kth <= s[lson].siz)
            return Getnum(lson, kth);
        else if(kth > s[lson].siz + s[x].cnt)
            return Getnum(rson, kth - s[lson].siz - s[x].cnt);
        else
            return x;

    }
    void Print1ToTot()
    {
        cout <<"tot"<< tot<<endl;
        for(int i = 1; i <= tot; i++)
        {
            cout <<i<<"'s  value:"<< s[i].val <<" cnt: "<<s[i].cnt<<" sum: "<<s[i].siz<<endl;
        }
        cout << endl;
    }
    void PrintfMidDfs(int x)
    {
        if(!x)
            return ;
        PrintfMidDfs(s[x].son[0]);
        cout <<s[x].val<<endl;
        PrintfMidDfs(s[x].son[1]);
    }
} bst;
///--------------------------------------------------------函数声明部分
//--------------------------------------其它

///--------------------------------------------------------main函数部分
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &val[i]);
    sort(val + 1, val + 1 + n);
    val[0] = -inf_, val[1 + n] = inf_;
    bst.Build(0, 1 + n, bst.root);
    int lastans = 0, op, x, y, ans = 0;
    for (int i = 1; i <= m; ++i)
    {
        scanf("%d%d", &op, &x);
        x ^= lastans, y = 0;
        if (op == 1)
            bst.Insert(bst.root, 0, x), y = bst.tot;
        if (op == 2)
            bst.Delete(x);
        if (op == 3)
            lastans = bst.Getrank(x), ans ^= lastans;
        if (op == 4)
            y = bst.Getnum(bst.root, x + 1), lastans = bst.s[y].val, ans ^= lastans;
        if (op == 5)
            y = bst.GetPre(bst.root, x), lastans = bst.s[y].val, ans ^= lastans;
        if (op == 6)
            y = bst.GetNext(bst.root, x), lastans = bst.s[y].val, ans ^= lastans;
        ///这一步可以加上

        if (y && (i % 10 == 0)) bst.Splay(y, bst.root);

    }
    printf("%d\n", ans);
    return 0;
}
///--------------------------------------------------------函数定义部分
//----------------------------------其它

2021/7/29 21:52
加载中...