herselfqwq @ 2021-11-14 21:05:21
RT,最近在学替罪羊,感觉大家都写得Splay,是这个题他卡替罪羊吗?怎么全T了?求挑错/kk
#include<bits/stdc++.h>
#define il inline
#define re register
#define ll long long
const int N=1e5+5,inf=0x3f3f3f3f,old=19260817;
const double seed=0.75;
il int R () {
re int s=0,f=1;re char ch=getchar();
while (!isdigit(ch)) if (ch=='-') f=-1,ch=getchar();
while (isdigit(ch)) s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return s*f;
}
int n,m,lastans,ans,val[N],rnd[N],tot,son[N][2],siz[N][3],f[N],root=1;
//siz[i][1]表示真正大小,siz[i][2]表示存在的点的大小,f[i]表示是否存在
il int check (int p) {
double fa=(double)1.0*siz[p][2]*seed;
double lc=(double)1.0*siz[son[p][0]][2],rc=(double)1.0*siz[son[p][1]][2];
return fa>=std::max(lc,rc);
}
std::vector<int> vec,mem;
il void dfs (int p) {
if (!p) return ;
dfs(son[p][0]);
if (f[p]) vec.push_back(p);
else mem.push_back(p);
dfs(son[p][1]);
}
il void pushup (int p) {
siz[p][1]=siz[son[p][0]][1]+siz[son[p][1]][1]+1;
siz[p][2]=siz[son[p][0]][2]+siz[son[p][1]][2]+1;
}
il void build (int l,int r,int &p) {
int mid=(l+r)>>1;
p=vec[mid];
if (l==r) {
son[p][0]=son[p][1]=0;
siz[p][1]=siz[p][2]=1;
return ;
}
if (l<mid) build(l,mid-1,son[p][0]);
else son[p][0]=0;
build(mid+1,r,son[p][1]);
pushup(p);
}
il void rebuild (int &p) {
vec.clear();
vec.push_back(inf);
dfs(p);
if (vec.size()!=1) build(1,vec.size()-1,p);
else p=0;
}
il void insert (int &p,int k) {
if (!p) {
p=mem.back(),mem.pop_back();
val[p]=k;
f[p]=siz[p][1]=siz[p][2]=1;
son[p][0]=son[p][1]=0;
return ;
}
siz[p][1]++,siz[p][2]++;
if (val[p]>=k) insert(son[p][0],k);
else insert(son[p][1],k);
if (!check(p)) rebuild(p);
}
il void del (int &p,int k) { //删除排名k
if (f[p]&&siz[son[p][0]][2]+1==k) {
f[p]=0,siz[p][2]--;
return ;
}
siz[p][2]--;
if (siz[son[p][0]][2]+f[p]>=k) del(son[p][0],k);
else del(son[p][1],k-siz[son[p][0]][2]-f[p]);
}
il int getrank (int k) { //寻找排名为k的数
int p=root;
while (p) {
if (f[p]&&siz[son[p][0]][2]+1==k) return val[p];
else if (siz[son[p][0]][2]>=k) p=son[p][0];
else k-=siz[son[p][0]][2]+f[p],p=son[p][1];
}
}
il int getnum (int k) { //寻找k的排名
int p=root,ret=1;
while (p) {
if (val[p]>=k) p=son[p][0];
else ret+=siz[son[p][0]][2]+f[p],p=son[p][1];
}
return ret;
}
il void Herself64akioi (int k) {
del(root,getnum(k));
if ((double)1.0*siz[root][1]*seed>=(double)siz[root][2]) rebuild(root);
}
int main () {
n=R(),m=R();
for (int i=4*N;i>=1;i--) mem.push_back(i);
for (int i=1;i<=n;i++) insert(root,R());
while (m--) {
int op=R(),x=R();x^=lastans;
if (op==1) insert(root,x);
if (op==2) Herself64akioi(x);
if (op==3) lastans=getnum(x),ans^=lastans;
if (op==4) lastans=getrank(x),ans^=lastans;
if (op==5) lastans=getrank(getnum(x)-1),ans^=lastans;
if (op==6) lastans=getrank(getnum(x+1)),ans^=lastans;
// std::cout<<op<<' '<<x<<' '<<lastans<<'\n';
}
printf("%d",ans);
return 0;
}
by ioker @ 2021-11-14 21:07:35
btd
by ssytxy2024 @ 2021-11-14 21:08:14
1e-10秒
by Buckbeak @ 2021-11-14 21:09:59
萌新暴击-100
妹子暴击-50
1e-10秒暴击-1e10
by herselfqwq @ 2021-11-14 21:23:30
嘤您们不要fAKe了
by ioker @ 2021-11-14 21:34:51
萌新暴击
妹子暴击
1e-10秒暴击
by Setoff @ 2021-11-14 22:36:53
不卡。
估计是你写挂了。
不想帮你调。
/xyx
by herselfqwq @ 2021-11-15 08:40:47
@うん、幸せ 草
by 林聪 @ 2021-11-25 18:58:23
@Herself64 不卡,我用替罪羊过了