对数据结构的不熟练
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 }