linlioo @ 2021-12-16 14:54:29
90分T了一个点,会的全用了,求大佬教一下
#include<bits/stdc++.h>
using namespace std;
struct node
{
int l,r,cnt,siz,key,data;
}a[1100010];
int w,last,sum;
inline int read()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
inline void pushup(int k)
{
a[k].siz=a[k].cnt+a[a[k].l].siz+a[a[k].r].siz;
}
inline void right_zig(int &k)
{
int kk=a[k].l;
a[k].l=a[kk].r;
a[kk].r=k;
pushup(k);
pushup(kk);
k=kk;
}
inline void left_zig(int &k)
{
int kk=a[k].r;
a[k].r=a[kk].l;
a[kk].l=k;
pushup(k);
pushup(kk);
k=kk;
}
inline void inser(int &k,int q)
{
if(k==0)
{
k=++w;
a[k].cnt=1;
a[k].data=q;
a[k].key=rand();
pushup(k);
}
else if(a[k].data==q)
{
a[k].cnt++;
pushup(k);
}
else if(a[k].data>q)
{
inser(a[k].l,q);
if(a[a[k].l].key<a[k].key)
{
right_zig(k);
}
else
{
pushup(k);
}
}
else
{
inser(a[k].r,q);
if(a[a[k].r].key<a[k].key)
{
left_zig(k);
}
else
{
pushup(k);
}
}
}
inline void delet(int k,int q)
{
if(a[k].data>q)
{
delet(a[k].l,q);
}
else if(a[k].data<q)
{
delet(a[k].r,q);
}
else
{
a[k].cnt--;
}
pushup(k);
}
inline int ran(int k,int q)
{
pushup(k);
if(k==0)
{
return 0;
}
if(a[k].data>q)
{
return ran(a[k].l,q);
}
else if(a[k].data<q)
{
return ran(a[k].r,q)+a[k].cnt+a[a[k].l].siz;
}
else return a[a[k].l].siz;
}
inline void find(int k,int q)
{
if(a[a[k].l].siz>=q)
{
find(a[k].l,q);
}
else if(a[a[k].l].siz+a[k].cnt<q)
{
find(a[k].r,q-a[k].cnt-a[a[k].l].siz);
}
else
{
int ans=a[k].data;
sum^=ans;
last=ans;
return ;
}
}
inline int lower(int k,int q)
{
if(k==0)
{
return -2100000000;
}
if(a[k].data>=q)
{
return lower(a[k].l,q);
}
else
{
if(a[k].cnt)
return max(a[k].data,lower(a[k].r,q));
else return max(lower(a[k].r,q),lower(a[k].l,q));
}
}
inline void write(int X)
{
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
inline int upper(int k,int q)
{
if(k==0)
{
return 2100000000;
}
else if(a[k].data<=q)
{
return upper(a[k].r,q);
}
else
{
if(a[k].cnt)
return min(upper(a[k].l,q),a[k].data);
else return min(upper(a[k].l,q),upper(a[k].r,q));
}
}
int main(int argc, char const *argv[])
{
int root=0,n,m;
n=read();
m=read();
while(n--)
{
int k=read();
inser(root,k);
}
for(int i=1;i<=m;i++)
{
int k=read(),q=read();
q^=last;
if(k==1)
{
inser(root,q);
}
else if(k==2)
{
delet(root,q);
}
else if(k==3)
{
int ans=ran(root,q)+1;
sum^=ans;
last=ans;
}
else if(k==4)
{
find(root,q);
}
else if(k==5)
{
int ans=lower(root,q);
sum^=ans;
last=ans;
}
else
{
int ans=upper(root,q);
sum^=ans;
last=ans;
}
}
write(sum);
return 0;
}
by DesignDigits @ 2021-12-16 16:14:17
O2
by linlioo @ 2021-12-16 16:28:28
@Codezhu 这道题不是本来就默认O2吗?
by Z_301 @ 2021-12-24 19:10:03
@linlioo 几个卡常小建议: