P6136MLE了,得了40分
code:
#include <bits/stdc++.h>
using namespace std;
long long cnt = 2ll,a[4999999][2],s[4999999];
long long fun()
{
a[cnt][0] = 0ll;
a[cnt][1] = 0ll;
s[cnt] = 0ll;
return cnt++;
}
void ins(long long x,long long d)
{
long long u = 1ll;
for(long long i = 30ll;i >= 0ll;i--)
{
long long v = (x >> i) & 1ll;
if(a[u][v] == 0ll)
{
a[u][v] = fun();
}
u = a[u][v];
s[u] += d;
}
}
long long cmp(long long k)
{
long long u = 1ll,x = 0ll;
for(long long i = 30ll;i >= 0ll;i--)
{
if(s[a[u][0]] >= k)
{
u = a[u][0];
}
else
{
x |= (1ll << i);
k -= s[a[u][0]];
u = a[u][1];
}
}
return x;
}
long long nt(long long x)
{
long long ans = 0ll,u = 1ll;
for(long long i = 30ll;i >= 0ll;i--)
{
if((x >> i) & 1ll)
{
ans += s[a[u][0]];
u = a[u][1];
}
else
{
u = a[u][0];
}
if(u == 0ll)
{
break;
}
}
return ans;
}
void clear()
{
a[1][0] = 0ll;
a[1][1] = 0ll;
cnt = 2ll;
}
long long pre(long long x)
{
long long ans;
ans = cmp(nt(x));
return ans;
}
long long nx(long long x)
{
long long ans;
ans = cmp(nt(x + 1ll) + 1ll);
return ans;
}
int main()
{
long long n,q;
scanf("%lld%lld",&n,&q);
for(long long i = 1ll;i <= n;i++)
{
long long x;
scanf("%lld",&x);
ins(x + (long long)(1 << 30),1ll);
}
long long m = 0ll,ans = (long long)(-1);
while(q--)
{
int f;
long long t,num = (long long)(1 << 30),x;
scanf("%d%lld",&f,&t);
x = m ^ t;
switch(f)
{
case 1:ins(x + num,1ll);break;
case 2:ins(x + num,(long long)(-1));break;
case 3:m = nt(x + num) + 1ll;if(ans == (long long)(-1)){ans = m;}else{ans ^= m;}break;
case 4:m = cmp(x) - num;if(ans == (long long)(-1)){ans = m;}else{ans ^= m;}break;
case 5:m = pre(x + num) - num;if(ans == (long long)(-1)){ans = m;}else{ans ^= m;}break;
case 6:m = nx(x + num) - num;if(ans == (long long)(-1)){ans = m;}else{ans ^= m;}
}
}
printf("%lld",ans);
return 0;
}
实在是不明白哪里超限了,以及咋改???
求助大佬,速回复,thx
解答让我AC者,得3关!(不要给我AC代码)