BZOJ3065。

去年用pascal 块链过了。。

今年来试了试非旋treap大法   注定被块链完爆

代码留这。

第一份 :辣鸡的  垃圾回收做法  跑得极慢

  1 #include <bits/stdc++.h>
  2 #define M 70000
  3 using namespace std;
  4 struct W{int l,r,s,v,e;}a[70005];
  5 struct O{int l,r,s,k;}b[15000000];
  6 int nex[15000000],A[35005],n,m,rt,ans,l,r,x,k,t,c,T,d[70005]; char op[3];
  7 void CL(int u){
  8     if (!u) return; --b[u].k;
  9     if (!b[u].k) nex[u]=t,t=u;
 10 }
 11 void NEW(int &u){
 12     int U=t; t=nex[t]; CL(u);
 13     CL(b[U].l); CL(b[U].r);
 14     b[U]=(O){b[u].l,b[u].r,b[u].s,1};
 15     u=U; ++b[b[u].l].k; ++b[b[u].r].k;
 16 }
 17 void add(int &u,int x,int p,int q,int X){
 18     NEW(u); b[u].s+=X;
 19     if (p<q)
 20     if (x<=p+q>>1) add(b[u].l,x,p,p+q>>1,X);
 21         else add(b[u].r,x,(p+q>>1)+1,q,X);
 22     if (!b[u].s) {nex[u]=t; t=u; u=0;}
 23 }
 24 void he(int &u,int v,int p,int q){
 25     if (!v) return;
 26     if (!u) {++b[u=v].k; return;}
 27     NEW(u); b[u].s+=b[v].s;
 28     he(b[u].l,b[v].l,p,p+q>>1);
 29     he(b[u].r,b[v].r,(p+q>>1)+1,q);
 30 }
 31 void up(int u){
 32     a[u].s=a[a[u].l].s+a[a[u].r].s+1;
 33     CL(a[u].e); a[u].e=0;
 34     add(a[u].e,a[u].v,0,M,1);
 35     he(a[u].e,a[a[u].l].e,0,M);
 36     he(a[u].e,a[a[u].r].e,0,M);
 37 }
 38 void build(int &u,int p,int q){
 39     if (p>q) return;
 40     u=p+q>>1; a[u].v=A[u];
 41     build(a[u].l,p,u-1);
 42     build(a[u].r,u+1,q);
 43     up(u);
 44 }
 45 void split(int u,int k,int &l,int &r){
 46     if (!k) {l=0; r=u; return;}
 47     if (k==a[u].s) {l=u; r=0; return;}
 48     if (k<=a[a[u].l].s) split(a[u].l,k,l,a[u].l),up(r=u);
 49      else split(a[u].r,k-a[a[u].l].s-1,a[u].r,r),up(l=u);
 50 }
 51 void join(int &u,int k){
 52     if ((1ll+a[u].s)*rand()<=RAND_MAX){
 53         int A,B; split(u,k,A,B);
 54         a[T].l=A; a[T].r=B; up(u=T);
 55     }else{
 56         if (k<=a[a[u].l].s) join(a[u].l,k);
 57         else join(a[u].r,k-a[a[u].l].s-1);
 58         add(a[u].e,a[T].v,0,M,1); ++a[u].s;
 59     }
 60 }
 61 void mody(int u,int k){
 62     if (a[a[u].l].s+1==k)
 63         r=a[u].v,a[u].v=l; else
 64     if (k<=a[a[u].l].s) mody(a[u].l,k);
 65         else mody(a[u].r,k-a[a[u].l].s-1);
 66     add(a[u].e,r,0,M,-1);
 67     add(a[u].e,l,0,M,1);
 68 }
 69 void find(int u,int l,int r){
 70     if (r<1||l>a[u].s) return;
 71     if (l<=1&&a[u].s<=r) {d[++c]=a[u].e; return;}
 72     if (l<=a[a[u].l].s+1&&a[a[u].l].s<r)
 73         add(d[1],a[u].v,0,M,1);
 74     find(a[u].l,l,r);
 75     find(a[u].r,l-a[a[u].l].s-1,r-a[a[u].l].s-1);
 76 }
 77 int main(){
 78     srand(233);
 79     scanf("%d",&n);
 80     for (int i=1;i<=n;++i) scanf("%d",&A[i]);
 81     for (int i=1;i<15000000;++i) nex[i]=i+1;
 82     t=1; build(rt,1,n); T=n;
 83     scanf("%d",&m);
 84     while (m--){
 85         scanf("%s",op);
 86         if (op[0]=='Q'){
 87             scanf("%d%d%d",&l,&r,&k);
 88             l^=ans; r^=ans; k^=ans;
 89             c=1; find(rt,l,r);
 90             l=0; r=M; int tt=d[1];
 91             while (l<r){
 92                 x=0;
 93                 for (int i=1;i<=c;++i) x+=b[b[d[i]].l].s;
 94                 if (x<k){
 95                     l=(l+r>>1)+1; k-=x;
 96                     for (int i=1;i<=c;++i) d[i]=b[d[i]].r;
 97                 }else{
 98                     r=l+r>>1;
 99                     for (int i=1;i<=c;++i) d[i]=b[d[i]].l;
100                 }
101             }
102             CL(tt); d[1]=0;
103             printf("%d\n",ans=l);
104         }else
105         if (op[0]=='M'){
106             scanf("%d%d",&k,&l);
107             l^=ans; k^=ans;
108             mody(rt,k);
109         }else{
110             scanf("%d%d",&l,&k);
111             l^=ans; k^=ans; --l;
112             ++T; a[T].v=k;
113             join(rt,l);
114         }
115     }
116     return 0;
117 }
奈奈

相关文章:

  • 2021-06-23
  • 2021-06-30
  • 2021-12-18
  • 2022-02-11
  • 2022-02-13
  • 2022-02-04
  • 2021-10-12
  • 2021-06-06
猜你喜欢
  • 2021-11-19
  • 2021-11-13
  • 2021-07-31
  • 2022-12-23
  • 2021-08-30
  • 2022-12-23
  • 2021-08-07
相关资源
相似解决方案