青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

在沒有修改操作時,應用劃分樹可以在O(MlogN)時間內解決查找區間第K小的問題,但是在引入修改(將原序列中的某個值改為另一個值)之后,劃分樹就不行了。
這時,需要數據結構聯合的思想。
可以觀察一下:
(1)區間操作:使用線段樹;
(2)修改值(其實是先刪除再插入)和找第K小:使用平衡樹;
現在這兩種操作都有,應該使用線段樹+平衡樹
準確來說是線段樹套平衡樹,即對原序列建立一棵線段樹,其中的每個結點內套一棵對該結點管轄區間內的平衡樹。

<1>結點類型(結構):
struct seg_node {
    
int l, r, mid, lch, rch, rt;
} T0[MAXN0];
struct SBT_node {
    
int v, l, r, p, sz0, sz, mul;
} T[MAXN];
其中seg_node是線段樹結點類型,SBT_node是平衡樹(SBT)結點類型。需要注意的是seg_node里面的rt域(root的縮寫),它是該結點內套的平衡樹的根結點下標索引(因為對于任意一棵平衡樹,只要知道了其根結點就可以遍歷整棵樹)。

<2>建樹:
建樹是線段樹和平衡樹一起建。在建立線段樹結點的時候,先建立一棵空的平衡樹(rt域置0),然后再在平衡樹里面逐個插入該結點管轄區間內的所有元素即可;

<3>修改:
修改操作要注意:如果要將A[x](A為原序列)的值修改為y,則需要自頂向下遍歷整棵線段樹,將所有包含了A[x]的結點內的平衡樹全部執行“刪除v=A[x](這個可以通過真正維護一個序列得到),再插入y”的操作;

<4>找區間第K小:
這個操作極其麻煩。需要借助二分。
設要在區間[l, r]中找到第K小。首先將[l, r]拆分成若干個線段樹結點,然后二分一個值x,在這些結點的平衡樹中找到x的rank(這里的rank指平衡樹中有多少個值比x小,不需要加1),加起來,最后再加1,就是x在[l, r]中的總名次。問題是,設[l..r]中第K小的數為v1,第(K+1)小的數為v2(如果不存在的話,v2=+∞),則[v1, v2)內的數都是“第K小”的。因此,不能二分數字,而應該二分元素。設S[i]為原序列中第i小的數,二分i,然后在根結點的平衡樹中找到第i小的即為S[i],再求其名次,這樣直到找到總名次為K的元素為止。問題還沒完,序列中可能有元素的值相同,這時可能永遠也找不到第K小的(比如序列1 2 3 3 3 4 5,K=4,若“序列中比x小的元素總數+1”為x的名次,則永遠也找不到第4小的),因此,若這樣求出的“名次”小于等于K,都應該將下一次的左邊界設為mid而不是(mid+1),而“名次”大于K時,該元素肯定不是第K小的,所以下一次右邊界設為(mid-1)。

代碼(本機測最猥瑣數據4s以內,交到ZJU上TLE,不知為什么,神犇指點一下,3x):
#include <iostream>
#include 
<stdio.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
const int MAXN0 = 110000, MAXN = 930000, INF = ~0U >> 2;
struct seg_node {
    
int l, r, mid, lch, rch, rt;
} T0[MAXN0];
struct SBT_node {
    
int v, l, r, p, sz0, sz, mul;
} T[MAXN];
int No0, No, n, root, rt0, a[MAXN0 >> 1], b[MAXN0 >> 1], l1, r1, len;
void slc(int _p, int _c)
{
    T[_p].l 
= _c; T[_c].p = _p;
}
void src(int _p, int _c)
{
    T[_p].r 
= _c; T[_c].p = _p;
}
void upd(int x)
{
    T[x].sz0 
= T[T[x].l].sz0 + T[T[x].r].sz0 + T[x].mul;
    T[x].sz 
= T[T[x].l].sz + T[T[x].r].sz + 1;
}
void lrot(int x)
{
    
int y = T[x].p; if (y == rt0) T[rt0 = x].p = 0else {int p = T[y].p; if (y == T[p].l) slc(p, x); else src(p, x);}
    src(y, T[x].l); slc(x, y); T[x].sz0 
= T[y].sz0; T[x].sz = T[y].sz; upd(y);
}
void rrot(int x)
{
    
int y = T[x].p; if (y == rt0) T[rt0 = x].p = 0else {int p = T[y].p; if (y == T[p].l) slc(p, x); else src(p, x);}
    slc(y, T[x].r); src(x, y); T[x].sz0 
= T[y].sz0; T[x].sz = T[y].sz; upd(y);
}
void maintain(int x, bool ff)
{
    
int z;
    
if (ff) {
        
if (T[T[T[x].r].r].sz > T[T[x].l].sz) {z = T[x].r; lrot(z);}
        
else if (T[T[T[x].r].l].sz > T[T[x].l].sz) {z = T[T[x].r].l; rrot(z); lrot(z);} else return;
    } 
else {
        
if (T[T[T[x].l].l].sz > T[T[x].r].sz) {z = T[x].l; rrot(z);}
        
else if (T[T[T[x].l].r].sz > T[T[x].r].sz) {z = T[T[x].l].r; lrot(z); rrot(z);} else return;
    }
    maintain(T[z].l, 
0); maintain(T[z].r, 1); maintain(z, 0); maintain(z, 1);
}
int find(int _v)
{
    
int i = rt0, v0;
    
while (i) {
        v0 
= T[i].v;
        
if (_v == v0) return i; else if (_v < v0) i = T[i].l; else i = T[i].r;
    }
    
return 0;
}
void ins(int _v)
{
    
if (!rt0) {
        T[
++No].v = _v; T[No].l = T[No].r = T[No].p = 0; T[No].sz0 = T[No].sz = T[No].mul = 1; rt0 = No;
    } 
else {
        
int i = rt0, j, v0;
        
while (1) {
            T[i].sz0
++; v0 = T[i].v;
            
if (_v == v0) {T[i].mul++return;} else if (_v < v0) j = T[i].l; else j = T[i].r;
            
if (j) i = j; else break;
        }
        T[
++No].v = _v; T[No].l = T[No].r = 0; T[No].sz0 = T[No].sz = T[No].mul = 1if (_v < v0) slc(i, No); else src(i, No);
        
while (i) {T[i].sz++; maintain(i, _v > T[i].v); i = T[i].p;}
    }
}
void del(int x)
{
    
if (T[x].mul > 1) {
        T[x].mul
--;
        
while (x) {T[x].sz0--; x = T[x].p;}
    } 
else {
        
int l = T[x].l, r = T[x].r;
        
if (!|| !r) {
            
if (x == rt0) T[rt0 = l + r].p = 0else {
                
int p = T[x].p; if (x == T[p].l) slc(p, l + r); else src(p, l + r);
                
while (p) {T[p].sz0--; T[p].sz--; p = T[p].p;}
            }
        } 
else {
            
int i = l, j;
            
while (j = T[i].r) i = j;
            T[x].v 
= T[i].v; T[x].mul = T[i].mul; int p = T[i].p; if (i == T[p].l) slc(p, T[i].l); else src(p, T[i].l);
            
while (p) {upd(p); p = T[p].p;}
        }
    }
}
int Find_Kth(int K)
{
    
int i = rt0, s0, m0;
    
while (i) {
        s0 
= T[T[i].l].sz0; m0 = T[i].mul;
        
if (K <= s0) i = T[i].l; else if (K <= s0 + m0) return T[i].v; else {K -= s0 + m0; i = T[i].r;}
    }
}
int rank(int _v)
{
    
int i = rt0, tot = 0, v0;
    
while (i) {
        v0 
= T[i].v;
        
if (_v == v0) {tot += T[T[i].l].sz0; return tot;} else if (_v < v0) i = T[i].l; else {tot += T[T[i].l].sz0 + T[i].mul; i = T[i].r;}
    }
    
return tot;
}
int mkt(int l, int r)
{
    T0[
++No0].l = l; T0[No0].r = r; int mid = l + r >> 1; T0[No0].mid = mid; rt0 = 0;
    re3(i, l, r) ins(a[i]); T0[No0].rt 
= rt0;
    
if (l < r) {int No00 = No0; T0[No00].lch = mkt(l, mid); T0[No00].rch = mkt(mid + 1, r); return No00;} else {T0[No0].lch = T0[No0].rch = 0return No0;}
}
void fs(int x)
{
    
if (x) {
        
int l0 = T0[x].l, r0 = T0[x].r;
        
if (l0 >= l1 && r0 <= r1) b[len++= T0[x].rt; else if (l0 > r1 || r0 < l1) returnelse {fs(T0[x].lch); fs(T0[x].rch);}
    }
}
void C(int x, int _v)
{
    
int i = root, l0, r0, mid0, v0 = a[x], N;
    
while (i) {
        l0 
= T0[i].l; r0 = T0[i].r; mid0 = T0[i].mid; rt0 = T0[i].rt;
        N 
= find(v0); del(N); ins(_v); T0[i].rt = rt0;
        
if (x <= mid0) i = T0[i].lch; else i = T0[i].rch;
    }
    a[x] 
= _v;
}
int Q(int K)
{
    len 
= 0; fs(root);
    
int ls = 1, rs = n, mids, midv, tot;
    
while (ls < rs) {
        mids 
= ls + rs + 1 >> 1; rt0 = T0[root].rt; midv = Find_Kth(mids);
        tot 
= 1; re(i, len) {rt0 = b[i]; tot += rank(midv);}
        
if (tot <= K) ls = mids; else rs = mids - 1;
    }
    rt0 
= T0[root].rt; return Find_Kth(ls);
}
int main()
{
    
int tests, m, x, y, K;
    
char ch;
    scanf(
"%d"&tests);
    re(testno, tests) {
        scanf(
"%d%d"&n, &m); No0 = No = 0;
        re(i, n) scanf(
"%d"&a[i]); ch = getchar();
        root 
= mkt(0, n - 1);
        re(i, m) {
            ch 
= getchar();
            
if (ch == 'C') {
                scanf(
"%d%d%*c"&x, &y);
                C(
--x, y);
            } 
else {
                scanf(
"%d%d%d%*c"&l1, &r1, &K);
                l1
--; r1--; printf("%d\n", Q(K));
            }
        }
    }
    
return 0;
}
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲日本中文字幕| 日韩视频免费| 韩国av一区二区| 国产精品日韩精品欧美在线 | 一二三区精品| 亚洲黄色成人久久久| 亚洲成人在线视频网站| 亚洲精品国产精品乱码不99| 亚洲精品欧美| 亚洲在线一区| 久久精品2019中文字幕| 久久久久久久一区二区三区| 久久综合网络一区二区| 亚洲国产精品成人久久综合一区 | 99亚洲伊人久久精品影院红桃| 亚洲精品午夜| 午夜精品亚洲| 老鸭窝亚洲一区二区三区| 欧美成人自拍视频| 国产精品入口麻豆原神| 一区免费视频| 亚洲欧美日韩一区| 麻豆9191精品国产| 亚洲桃花岛网站| 久久婷婷人人澡人人喊人人爽 | a91a精品视频在线观看| 亚洲欧美国产毛片在线| 久久久亚洲午夜电影| 亚洲国产天堂久久综合| 午夜精品久久久久久| 蜜臀av一级做a爰片久久| 国产精品久久久久久久久久ktv | 亚洲一区二区在线看| 免费成人高清在线视频| 亚洲性夜色噜噜噜7777| 免费观看日韩| 国产亚洲精品成人av久久ww| 在线视频欧美日韩精品| 免费观看成人www动漫视频| 在线亚洲欧美| 欧美激情一区二区三级高清视频 | 国产午夜精品理论片a级大结局 | 亚洲一区二区视频在线观看| 免费毛片一区二区三区久久久| 亚洲无亚洲人成网站77777| 欧美成人日本| 在线观看视频免费一区二区三区| 亚洲免费影视| 亚洲免费观看高清在线观看 | 亚洲黄网站在线观看| 久久精品视频免费观看| 国产欧美日韩专区发布| 亚洲女性裸体视频| 夜夜嗨av色一区二区不卡| 欧美大片在线看免费观看| 国产毛片一区| 香蕉国产精品偷在线观看不卡| 亚洲日本一区二区三区| 欧美成va人片在线观看| 亚洲成人自拍视频| 久久综合色一综合色88| 久久精品国产清自在天天线| 国产视频精品va久久久久久| 欧美在线电影| 久久成人18免费网站| 极品尤物久久久av免费看| 久久夜色精品国产亚洲aⅴ| 久久欧美中文字幕| 亚洲国产合集| 艳妇臀荡乳欲伦亚洲一区| 欧美国产高清| 欧美一级专区免费大片| 国产亚洲一区二区精品| 久久久国际精品| 欧美尤物一区| 在线播放不卡| 欧美激情亚洲视频| 欧美日韩国产高清| 亚洲在线播放| 欧美一区二视频| 最新日韩av| 一区二区av在线| 国产欧美精品在线播放| 久久人体大胆视频| 美女国内精品自产拍在线播放| 亚洲精品资源美女情侣酒店| 亚洲精选中文字幕| 国产乱人伦精品一区二区| 久色婷婷小香蕉久久| 欧美aaa级| 亚洲在线观看视频网站| 欧美伊人久久| 亚洲毛片在线看| 亚洲欧美日韩第一区| 亚洲国产高清自拍| 中日韩在线视频| 亚洲高清不卡| 亚洲图片欧洲图片av| 韩日在线一区| 99视频在线观看一区三区| 一区精品久久| 亚洲一级片在线观看| 亚洲国产高清在线观看视频| 在线亚洲一区| 91久久综合亚洲鲁鲁五月天| 亚洲一区二区三区成人在线视频精品| 黄色成人av网| 宅男噜噜噜66一区二区| 最新国产の精品合集bt伙计| 午夜精品短视频| 亚洲最新视频在线| 久久综合色8888| 久久精品国产精品亚洲综合| 欧美日韩人人澡狠狠躁视频| 久久综合狠狠| 国产精品一区二区三区乱码| 亚洲精品中文字| 亚洲国产日韩欧美在线动漫| 午夜精品福利视频| 亚洲资源av| 欧美日韩999| 亚洲国产清纯| 1769国产精品| 久久天堂av综合合色| 欧美在线观看天堂一区二区三区| 欧美精品久久久久久久久久| 欧美国产大片| 1024精品一区二区三区| 久久精品一区| 久久狠狠亚洲综合| 国产麻豆视频精品| 亚洲一区二区成人在线观看| 在线亚洲一区二区| 欧美日韩和欧美的一区二区| 欧美亚洲综合另类| 亚洲精品一区二区三| 亚洲国产一区二区三区在线播| 久久久美女艺术照精彩视频福利播放 | 欧美一区二区三区日韩视频| 久久国产精品99久久久久久老狼| 欧美性猛交视频| 亚洲免费av观看| 亚洲一区二区三区777| 欧美三级日韩三级国产三级| 亚洲精品午夜精品| 在线一区二区三区四区| 欧美日韩一区视频| 一区二区三区偷拍| 午夜免费日韩视频| 国产日韩欧美亚洲一区| 性欧美超级视频| 久久天堂成人| 亚洲国产一区视频| 欧美日韩精品综合| 午夜国产一区| 欧美国产一区二区| 亚洲视频欧美视频| 国产欧美日韩精品一区| 久久亚洲精品中文字幕冲田杏梨| 欧美成人精品影院| 亚洲伦理在线免费看| 欧美日韩国产精品成人| 亚洲色无码播放| 久久久国产精品一区二区中文 | 久久国产精品久久w女人spa| 美日韩免费视频| 一区二区成人精品| 国产日韩欧美三区| 欧美精品综合| 香蕉久久夜色精品国产使用方法 | 亚洲综合精品| 免费观看在线综合| 一区二区欧美日韩| 国产亚洲一区二区三区在线观看 | 一区二区三区www| 欧美有码在线视频| 亚洲啪啪91| 国产情人节一区| 欧美高清你懂得| 午夜精品免费视频| 亚洲国产精品成人精品| 欧美一区二区在线看| 亚洲精品一区二区三区av| 国产精品一区免费在线观看| 牛牛精品成人免费视频| 午夜宅男久久久| 亚洲精品国久久99热| 猫咪成人在线观看| 亚洲一区久久久| 亚洲三级视频| 精品盗摄一区二区三区| 国产精品免费看| 欧美剧在线观看| 欧美黄色成人网| 亚洲精选在线观看| 欧美国产日韩a欧美在线观看| 欧美一区午夜精品| 亚洲视频网在线直播| 亚洲破处大片| 亚洲第一精品电影|