树套树专题

对数据结构的不熟练

3196: Tyvj 1730 二逼平衡树

尝试一下树状数组套主席树的写法。

  1 #include<bits/stdc++.h>
  2 const int maxn = 50035;
  3 const int maxNode = 5000035;
  4 const int INF = 2147483647;
  5 
  6 struct node
  7 {
  8     int val,l,r;
  9 }f[maxNode];
 10 struct QRs
 11 {
 12     int opt,l,r,k;
 13 }qr[maxn];
 14 int n,m,rt[maxn],v[maxn],tot,cnt[maxn<<1];
 15 int cntl,cntr,L[maxn],R[maxn];
 16 
 17 int read()
 18 {
 19     char ch = getchar();
 20     int num = 0, fl = 1;
 21     for (; !isdigit(ch); ch=getchar())
 22         if (ch=='-') fl = -1;
 23     for (; isdigit(ch); ch=getchar())
 24         num = (num<<1)+(num<<3)+ch-48;
 25     return num*fl;
 26 }
 27 void update(int pre, int &rt, int l, int r, int c, int d)
 28 {
 29     int mid = (l+r)>>1;
 30     rt = ++tot, f[rt].val = f[pre].val+d;
 31     f[rt].l = f[pre].l, f[rt].r = f[pre].r;
 32     if (l==r) return;
 33     if (c <= mid) update(f[pre].l, f[rt].l, l, mid, c, d);
 34     else update(f[pre].r, f[rt].r, mid+1, r, c, d);
 35 }
 36 int rank(int L, int R, int c)
 37 {
 38     int ret = 0, mid;
 39     for (int i=R; i; i-=i&-i)
 40     {
 41         int u = rt[i], l = 1, r = cnt[0];
 42         while (f[u].val&&l!=r)
 43         {
 44             mid = (l+r)>>1;
 45             if (c <= mid) r = mid, u = f[u].l;
 46             else l = mid+1, ret += f[f[u].l].val, u = f[u].r;
 47         }
 48     }
 49     for (int i=L; i; i-=i&-i)
 50     {
 51         int u = rt[i], l = 1, r = cnt[0];
 52         while (f[u].val&&l!=r)
 53         {
 54             mid = (l+r)>>1;
 55             if (c <= mid) r = mid, u = f[u].l;
 56             else l = mid+1, ret -= f[f[u].l].val, u = f[u].r;
 57         }
 58     }
 59     return ret;
 60 }
 61 int ask(int l, int r, int k)
 62 {
 63     if (l==r) return l;
 64     int mid = (l+r)>>1, val = 0;
 65     for (int i=1; i<=cntr; i++) val += f[f[R[i]].l].val;
 66     for (int i=1; i<=cntl; i++) val -= f[f[L[i]].l].val;
 67 //    printf("l:%d r:%d tot:%d\n",l,r,val);
 68     if (k <= val){
 69         for (int i=1; i<=cntl; i++) L[i] = f[L[i]].l;
 70         for (int i=1; i<=cntr; i++) R[i] = f[R[i]].l;
 71         return ask(l, mid, k);
 72     }else{
 73         for (int i=1; i<=cntl; i++) L[i] = f[L[i]].r;
 74         for (int i=1; i<=cntr; i++) R[i] = f[R[i]].r;
 75         return ask(mid+1, r, k-val);
 76     }
 77 }
 78 void getRank(int l, int r, int k)
 79 {
 80     for (int j=l; j; j-=j&-j) L[++cntl] = rt[j];
 81     for (int j=r; j; j-=j&-j) R[++cntr] = rt[j];
 82 //    printf("%d\n",cnt[ask(1, cnt[0], k)+1]);
 83     printf("#%d\n",ask(1, cnt[0], k));
 84 }
 85 int main()
 86 {
 87     n = read(), m = read();
 88     for (int i=1; i<=n; i++) v[i] = cnt[++cnt[0]] = read();
 89     for (int i=1; i<=m; i++)
 90     {
 91         qr[i].opt = read();
 92         if (qr[i].opt==3) qr[i].l = read();
 93         else qr[i].l = read(), qr[i].r = read();
 94         qr[i].k = cnt[++cnt[0]] = read();
 95     }
 96     cnt[++cnt[0]] = INF, cnt[++cnt[0]] = -INF;
 97     std::sort(cnt+1, cnt+cnt[0]+1);
 98     cnt[0] = std::unique(cnt+1, cnt+cnt[0]+1)-cnt-1;
 99     for (int i=1; i<=cnt[0]; i++) printf("p:%d %d\n",i,cnt[i]);
100     for (int i=1; i<=n; i++)
101     {
102         v[i] = std::lower_bound(cnt+1, cnt+cnt[0]+1, v[i])-cnt;
103         for (int p=i; p<=n; p+=p&-p)
104             update(rt[p], rt[p], 1, cnt[0], v[i], 1);
105     }
106     for (int i=1; i<=n; i++) printf("%d ",v[i]);puts("");
107     for (int opt, i=1; i<=m; i++)
108     {
109         opt = qr[i].opt, cntl = cntr = 0;
110         if (opt!=2) qr[i].k = std::lower_bound(cnt+1, cnt+cnt[0]+1, qr[i].k)-cnt;
111         if (opt==1){
112 //            for (int j=qr[i].l; j; j-=j&-j) L[++cntl] = rt[j];
113 //            for (int j=qr[i].r; j; j+=j&-j) R[++cntr] = rt[j];
114             printf("%d\n",rank(qr[i].l-1, qr[i].r, qr[i].k-1)+1);
115         }
116         if (opt==2){
117 //            printf("l:%d r:%d c:%d\n",qr[i].l,qr[i].r,qr[i].k);
118             getRank(qr[i].l-1, qr[i].r, qr[i].k);
119         }
120         if (opt==3){
121             for (int p=qr[i].l; p<=n; p+=p&-p)
122                 update(rt[p], rt[p], 1, cnt[0], v[qr[i].l], -1);
123             v[qr[i].l] = qr[i].k;
124             for (int p=qr[i].l; p<=n; p+=p&-p)
125                 update(rt[p], rt[p], 1, cnt[0], qr[i].k, 1);
126         }
127         if (opt==4){
128             int rkx = rank(qr[i].l-1, qr[i].r, qr[i].k);
129             if (rkx==1) printf("%d\n",-INF);
130             else{
131                 printf("[%d,%d] val:%d rk:%d\n",qr[i].l,qr[i].r,qr[i].k,rkx);
132                 getRank(qr[i].l-1, qr[i].r, rkx-1);
133             }
134         }
135         if (opt==5){
136             int rkx = rank(qr[i].l-1, qr[i].r, qr[i].k);
137             if (rkx==qr[i].r-qr[i].l+1) printf("%d\n",INF);
138             else{
139                 getRank(qr[i].l-1, qr[i].r, rkx+1);
140             }
141         }
142     }
143     return 0;
144 }

猜你喜欢

转载自www.cnblogs.com/antiquality/p/10453271.html