zoukankan      html  css  js  c++  java
  • 非旋treap套线段树

    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
    ",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 }
    奈奈

    第二份:暴力回收,暴力合并,快了许多

      1 #include <bits/stdc++.h>
      2 #define M 70000
      3 #define S 15000000
      4 using namespace std;
      5 int D[S],rt,t,d[70005],m,x,l,r,k,n,ans,Q; char OP;
      6 struct O{int l,r,s,v,e;}a[70005];
      7 struct U{int l,r,s;}b[S];
      8 void cl(int &u){
      9     if (!u) return;
     10     cl(b[u].l); cl(b[u].r);
     11     D[++t]=u; b[u].s=0; u=0;
     12 }
     13 void add(int &u,int p,int q,int x){
     14     if (!u) u=D[t--]; ++b[u].s;
     15     if (p!=q)
     16         if (x<=p+q>>1) add(b[u].l,p,p+q>>1,x);
     17         else add(b[u].r,(p+q>>1)+1,q,x);
     18 }
     19 void del(int &u,int p,int q,int x){
     20     --b[u].s;
     21     if (p!=q)
     22         if (x<=p+q>>1) del(b[u].l,p,p+q>>1,x);
     23         else del(b[u].r,(p+q>>1)+1,q,x);
     24     if (!b[u].s) D[++t]=u,u=0;
     25 }
     26 int he(int l,int r){
     27     if (!l&&!r) return 0;
     28     int u=D[t--];
     29     b[u].s=b[l].s+b[r].s;
     30     b[u].l=he(b[l].l,b[r].l);
     31     b[u].r=he(b[l].r,b[r].r);
     32     return u;
     33 }
     34 void up(int u){
     35     a[u].s=a[a[u].l].s+a[a[u].r].s+1;
     36     cl(a[u].e);
     37     a[u].e=he(a[a[u].l].e,a[a[u].r].e);
     38     add(a[u].e,0,M,a[u].v);
     39 }
     40 void build(int &u,int p,int q){
     41     if (p>q) return;
     42     u=p+q>>1;
     43     build(a[u].l,p,u-1);
     44     build(a[u].r,u+1,q);
     45     up(u);
     46 }
     47 void find(int u,int l,int r){
     48     if (r<1||l>a[u].s) return;
     49     if (l<=1&&a[u].s<=r) {d[++m]=a[u].e; return;}
     50     int i=a[a[u].l].s+1;
     51     if (l<=i&&i<=r)
     52         add(d[1],0,M,a[u].v);
     53     find(a[u].l,l,r);
     54     find(a[u].r,l-i,r-i);
     55 }
     56 void mody(int u){
     57     int i=a[a[u].l].s+1;
     58     if (i==k) l=a[u].v,a[u].v=r; else
     59     if (k<i) mody(a[u].l);
     60     else k-=i,mody(a[u].r);
     61     del(a[u].e,0,M,l);
     62     add(a[u].e,0,M,r);
     63 }
     64 void split(int u,int k,int &l,int &r){
     65     if (!k) {l=0,r=u; return;}
     66     if (k==a[u].s) {l=u,r=0; return;}
     67     if (k<=a[a[u].l].s){
     68         split(a[u].l,k,l,a[u].l); up(r=u);
     69     }else{
     70         split(a[u].r,k-a[a[u].l].s-1,a[u].r,r); up(l=u);
     71     }
     72 }
     73 void join(int &u){
     74     if ((1ll+a[u].s)*rand()<=RAND_MAX){
     75         int A,B; split(u,k,A,B);
     76         a[n].l=A; a[n].r=B; up(u=n);
     77     }else{
     78         if (k<=a[a[u].l].s) join(a[u].l);
     79         else k-=a[a[u].l].s+1,join(a[u].r);
     80         add(a[u].e,0,M,a[n].v); ++a[u].s;
     81     }
     82 }
     83 int main(){
     84     srand(23);
     85     scanf("%d",&n);
     86     for (int i=1;i<=n;++i) scanf("%d",&a[i].v);
     87     for (int i=S-1;i;--i) D[i]=++t;
     88     build(rt,1,n);
     89     scanf("%d",&Q);
     90     while (Q--){
     91         scanf("
    %c",&OP);
     92         if (OP=='Q'){
     93             scanf("%d%d%d",&l,&r,&k);
     94             l^=ans; r^=ans; k^=ans;
     95             m=1; find(rt,l,r);
     96             l=0; r=M; int tt=d[1];
     97             while (l<r){
     98                 x=0;
     99                 for (int i=1;i<=m;++i) x+=b[b[d[i]].l].s;
    100                 if (x<k){
    101                     l=(l+r>>1)+1; k-=x;
    102                     for (int i=1;i<=m;++i) d[i]=b[d[i]].r;
    103                 }else{
    104                     r=l+r>>1;
    105                     for (int i=1;i<=m;++i) d[i]=b[d[i]].l;
    106                 }
    107             }
    108             cl(d[1]=tt); printf("%d
    ",ans=l);
    109         }else
    110         if (OP=='M'){
    111             scanf("%d%d",&k,&r);
    112             k^=ans; r^=ans;
    113             mody(rt);
    114         }else{
    115             scanf("%d%d",&k,&x);
    116             k^=ans; a[++n].v=x^ans;
    117             --k; join(rt);
    118         }
    119     }
    120     return 0;
    121 }
    雲珠桜
  • 相关阅读:
    vuex
    koa2+node+vue自启服务运行本地脚本
    重新认识js(一)
    JQuery图片左右无缝滚动
    javascript兼容性很好的省市区联动,易修改
    JQuery超级简单的TAB选项卡
    ViewState的原理分析
    JQuery图片切换特效
    asp.net验证控件详解【转】
    时间线 制作
  • 原文地址:https://www.cnblogs.com/cyz666/p/8038330.html
Copyright © 2011-2022 走看看