权值线段树 RE on #3 #13

P3369 【模板】普通平衡树

``` #include<algorithm> #include<iostream> #include<cstdio> #define int long long using namespace std; inline int read(){ int x=0,flag=1;char ch=getchar(); while(ch<'0' || ch>'9'){if(ch=='-')flag=-1;ch=getchar();} while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); return x*flag; } const int N=1e5+10; struct NODE{ int op,x; }a[N]; int b[N]; struct Node{ int l,r; int tot; }t[N<<2]; Node operator +(const Node &a,const Node &b){ Node res; res.l=a.l,res.r=b.r; res.tot=a.tot+b.tot; return res; } void build(int p,int l,int r){ t[p].l=l,t[p].r=r; if(l==r) return; int mid=(l+r)>>1; build(p<<1,l,mid); build(p<<1|1,mid+1,r); } void add(int p,int val){ t[p].tot++; if(t[p].l==t[p].r) return; int mid=(t[p].l+t[p].r)>>1; if(val<=mid) add(p<<1,val); else add(p<<1|1,val); } void del(int p,int val){ if(!t[p].tot) return; t[p].tot--; if(t[p].l==t[p].r) return; int mid=(t[p].l+t[p].r)>>1; if(val<=mid) del(p<<1,val); else del(p<<1|1,val); } //int sum(int p,int val){ // if(t[p].l==t[p].r) return 0; // int mid=(t[p].l+t[p].r)>>1; // if(val<=mid) return sum(p<<1,val); // else return t[p<<1].tot+sum(p<<1|1,val); //} int sum(int p,int l,int r){ if(l<=t[p].l && t[p].r<=r) return t[p].tot; int mid=(t[p].l+t[p].r)>>1; if(r<=mid) return sum(p<<1,l,r); else return t[p<<1].tot+sum(p<<1|1,l,r); } int kth(int p,int val){ if(t[p].l==t[p].r) return t[p].l; // if(val==1) return t[p].l; int mid=(t[p].l+t[p].r)>>1; if(val<=t[p<<1].tot) return kth(p<<1,val); else return kth(p<<1|1,val-t[p<<1].tot); } inline int query5(int val){ int num=sum(1,1,val-1); // cout<<"query5 "<<num<<'\n'; return kth(1,num); } inline int query6(int val){ int num=sum(1,1,val)+1; // cout<<"query6 "<<num<<'\n'; return kth(1,num); } signed main(){ // freopen("114.in","r",stdin); // freopen("114.out","w",stdout); int n=read(),cnt=0; for(int i=1;i<=n;++i){ a[i].op=read(),a[i].x=read(); if(a[i].op!=4) b[++cnt]=a[i].x; } sort(b+1,b+cnt+1); int lenb=unique(b+1,b+n+1)-(b+1); build(1,1,cnt); for(int i=1;i<=n;++i){ int op=a[i].op,x=lower_bound(b+1,b+lenb+1,a[i].x)-b; if(op==4) x=a[i].x; // cout<<op<<' '<<x<<'\n'; if(op==1) add(1,x); if(op==2) del(1,x); if(op==3) cout<<sum(1,1,x-1)+1<<'\n'; if(op==4) cout<<b[kth(1,x)]<<'\n'; if(op==5) cout<<b[query5(x)]<<'\n'; if(op==6) cout<<b[query6(x)]<<'\n'; } return 0; } ```
by dyyzy_qwq @ 2023-10-15 20:43:34


@[dyyzy_qwq](/user/461012) 权值线段树 4 倍空间不够吧/yiw 我一般都开 40 倍空间
by hello_world_djh @ 2023-10-15 21:00:07


@[hello_world_djh](/user/450700) 离散化了QwQ。鉴定为神奇的数据导致的
by dyyzy_qwq @ 2023-10-15 21:02:58


@[dyyzy_qwq](/user/461012) 题目貌似不保证5 6询问都在范围内
by dyyzy_qwq @ 2023-10-15 21:04:50


|