这里是题目 但是其实应该和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;
}
///--------------------------------------------------------函数定义部分
//----------------------------------其它