国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

【POJ 2104】K-th Number&主席樹詳解

2019-11-11 07:55:17
字體:
供稿:網(wǎng)友

POJ 2104

題意

給定1到n的排列,每次詢問某一區(qū)間內(nèi)的第k小值。

樣例輸入

7 3 1 5 2 6 3 7 4 2 5 3 4 4 1 1 7 3

樣例輸出

5 6 3


主席樹介紹

可持久化線段樹,函數(shù)式線段樹。 有點(diǎn)抽象,能夠理解但還不是很熟練,代碼不長(zhǎng),但是非常簡(jiǎn)練,有很多技巧,目前當(dāng)做黑箱。

可持久化:每次操作盡量用新節(jié)點(diǎn)表示而不是修改原節(jié)點(diǎn),這樣就能保留所有歷史信息。 函數(shù)式:函數(shù)式編程里變量常常是不變的,線段樹的函數(shù)式寫法就是這樣。

我們用區(qū)間k小值來解釋。

一些預(yù)處理

離散化(排序+去重),其實(shí)本道題不需要這個(gè)操作。 下面的代碼用到了STL的很多技巧,用unique()函數(shù)去重,用lower_bound()重新映射a數(shù)組。

for (i = 1;i <= n; i++) scanf("%d",&a[i]);for (i = 1;i <= n; i++) b[i] = a[i];sort(b+1,b+n+1);k = unique(b+1,b+n+1) - (b+1);for (i = 1;i <= n; i++) a[i] = lower_bound(b+1,b+k+1,a[i])-b;

假設(shè)求整個(gè)區(qū)間的k小值

這個(gè)問題可以用AVL樹做,但是這里介紹一種類似平衡樹的方法。假設(shè)某個(gè)節(jié)點(diǎn)的區(qū)間為[l,r],則這個(gè)節(jié)點(diǎn)記錄的是在a數(shù)組中有多少個(gè)a[i]滿足l<=a[i]<=r。這樣搜索第k小值時(shí),如果左孩子數(shù)量小于k則k小值在左子樹中,反之則在右子樹中。復(fù)雜度log(n)。

對(duì)于任意區(qū)間[L,R]

建立n棵線段樹,每棵維護(hù)[1,i]的數(shù)字出現(xiàn)情況。 顯然這n棵線段樹每個(gè)節(jié)點(diǎn)代表的區(qū)間都是一樣的,所以這n棵線段樹同構(gòu)。 用第R棵線段樹去“減”第(L-1)棵線段樹,得出來的結(jié)果就是區(qū)間[L,R]的情況,對(duì)這棵樹套用一遍上面求整個(gè)區(qū)間的方法就可以求出[L,R]中的k小值。

如何節(jié)約空間

上面的方法看起來還是比較具體的,但是會(huì)MLE(n棵線段樹)。 下面的優(yōu)化就是主席樹的精髓:如何扔掉重復(fù)的節(jié)點(diǎn)。有點(diǎn)抽象,這段話看懂了就比較輕松了。

我們發(fā)現(xiàn),第i棵線段樹和第i+1棵線段樹的區(qū)別在于加入了a[i+1]這個(gè)數(shù),而a[i+1]在第i棵樹上從根出發(fā)向下走,走過的節(jié)點(diǎn)+1就變成了第i+1棵線段樹。(你可以自己畫一下看看有什么不同)

也就是說相鄰兩棵線段樹之間不同節(jié)點(diǎn)個(gè)數(shù)至多為log(n)個(gè),換句話說剩下這么多的節(jié)點(diǎn)都是一樣的! 那么重復(fù)的節(jié)點(diǎn)就可以扔掉了。比如說一個(gè)節(jié)點(diǎn)的左孩子是重復(fù)的,那么我不需要多開一個(gè)節(jié)點(diǎn),而是直接連到前一棵樹上。 看起來比較復(fù)雜,但是編程中有很多技巧,最后代碼比普通線段樹還短。 P.S. 怕以后忘記這里寫的會(huì)很詳細(xì)。

sol

預(yù)處理這里就不再寫了。

建樹

現(xiàn)在連建樹都要重新寫了TAT。 其實(shí)只要建一棵空樹即可,后面的樹都是連到這棵樹上。 但是后面再update和query的時(shí)候有一個(gè)問題:左孩子和右孩子并不能簡(jiǎn)單的乘2和乘2加1,如何解決?

//root[i]表示第i棵樹的根的位置void build(int l,int r,int &rt){ rt = ++tot; sum[rt] = 0; if (l == r) return; int m = (l + r) >> 1; build(l,m,ls[rt]); build(m+1,r,rs[rt]);}...tot = 0;build(1,k,root[0]);

用最樸素的方法:一個(gè)一個(gè)累加! 這里有一個(gè)技巧就是用了&,也就是說等到搜到這個(gè)點(diǎn)的時(shí)候自然會(huì)把這個(gè)點(diǎn)的位置給傳回來。這個(gè)技巧剩下了不少代碼,在后面的update和query中可以自己體會(huì)。

更新

//ls表示左孩子位置 rs表示右孩子位置 last表示前一棵樹、當(dāng)前節(jié)點(diǎn)的位置void update(int l,int r,int &rt,int last,int p){ rt = ++tot; ls[rt] = ls[last]; rs[rt] = rs[last];//暫時(shí)兩個(gè)孩子都連到前一棵樹的對(duì)應(yīng)孩子上 sum[rt] = sum[last] + 1;//這一步可以解釋是哪log(n)個(gè)點(diǎn)的值發(fā)生了修改! if (l == r) return; int m = (l + r) >> 1; if (p <= m) update(l,m,ls[rt],ls[last],p); else update(m+1,r,rs[rt],rs[last],p);//修改的那個(gè)節(jié)點(diǎn)開辟出一個(gè)新節(jié)點(diǎn) ls/rs會(huì)回傳新的節(jié)點(diǎn)的位置!前面講到過}...for (i = 1;i <= n; i++) update(1,k,root[i],root[i-1],a[i]);

這樣一來就把這“n棵線段樹”都建好了??梢钥闯鲭m然節(jié)點(diǎn)總數(shù)為nlog(n),但是卻把所有的情況都記錄下來了,這就是“可持久化”。

查詢

int query(int ss,int tt,int l,int r,int k){ if (l == r) return l; int m = (l + r) >> 1; int cnt = sum[ls[tt]] - sum[ls[ss]];//用第tt棵線段樹減去第ss棵線段樹 if (k <= cnt) return query(ls[ss],ls[tt],l,m,k); else return query(rs[ss],rs[tt],m+1,r,k-cnt);}...while (q--) { scanf("%d%d%d",&ql,&qr,&qk); int res = query(root[ql-1],root[qr],1,k,qk); 有了前面的鋪墊,查詢就比較簡(jiǎn)單了。

完整代碼

#include<cmath>#include<cstdio>#include<vector>#include<cstring>#include<ioman
ip>#include<stdlib.h>#include<iostream>#include<algorithm>#define ll long long#define inf 1000000000#define mod 1000000007#define N 100000using namespace std;int a[N],b[N],root[N*20],ls[N*20],rs[N*20],sum[N*20];int n,q,i,tot,k,ql,qr,qk;void build(int l,int r,int &rt){ rt = ++tot; sum[rt] = 0; if (l == r) return; int m = (l + r) >> 1; build(l,m,ls[rt]); build(m+1,r,rs[rt]);}void update(int l,int r,int &rt,int last,int p){ rt = ++tot; ls[rt] = ls[last]; rs[rt] = rs[last]; sum[rt] = sum[last] + 1; if (l == r) return; int m = (l + r) >> 1; if (p <= m) update(l,m,ls[rt],ls[last],p); else update(m+1,r,rs[rt],rs[last],p);}int query(int ss,int tt,int l,int r,int k){ if (l == r) return l; int m = (l + r) >> 1; int cnt = sum[ls[tt]] - sum[ls[ss]]; if (k <= cnt) return query(ls[ss],ls[tt],l,m,k); else return query(rs[ss],rs[tt],m+1,r,k-cnt);}int main(){ cin>>n>>q; for (i = 1;i <= n; i++) scanf("%d",&a[i]); for (i = 1;i <= n; i++) b[i] = a[i]; sort(b+1,b+n+1); k = unique(b+1,b+n+1) - (b+1); for (i = 1;i <= n; i++) a[i] = lower_bound(b+1,b+k+1,a[i])-b; tot = 0; build(1,k,root[0]); for (i = 1;i <= n; i++) update(1,k,root[i],root[i-1],a[i]); while (q--) { scanf("%d%d%d",&ql,&qr,&qk); int res = query(root[ql-1],root[qr],1,k,qk); printf("%d/n",b[res]); } return 0;}
上一篇:flex4 spark 布局

下一篇:【POJ 3667】Hotel

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产成人精品久久一区二区小说| 激情亚洲综合网| 最新中文字幕在线| 福利视频在线看| 国产美女性感在线观看懂色av| 欧美性猛交xxxx免费看蜜桃| 四虎国产精品永久| 欧美日韩亚洲第一页| 久久久久国产精品嫩草影院| 久久国产热视频| 国产激情视频在线观看| 久热国产在线视频| 国产精品人人爱一区二区白浆| 国产精品ⅴa有声小说| 91欧洲在线视精品在亚洲| 午夜性爽视频男人的天堂| 成人av小说网| 97在线超碰| 中文字幕在线观看日本| 69久久久久| 午夜视频在线免费| 日韩不卡高清| 精品视频一区二区观看| 超碰在线97国产| 在线视频99| 国产成人午夜电影| 免费看的毛片| 日韩不卡高清| av在线播放av| 精品国产高清自在线一区二区三区| 久久久久国产精品嫩草影院| av网站大全在线| 国产日韩欧美精品一区二区三区 | 怡红院av在线| 国产在线中文字幕| 亚洲va国产日韩欧美精品色婷婷| 国产永久免费高清在线观看视频 | 精品欧美色视频网站在线观看| 国内精品一区视频| 免费在线黄色av| 日日夜夜中文字幕| 91精品大全| 99高清免费国产自产拍| 国产色视频网站| 国产精品777一区二区| 国产精品9区| 精品成人免费自拍视频| 国产香蕉尹人视频在线| 中文字幕在线影院| 国产日本韩国在线播放| 国产视频精选在线| 国产区视频在线观看| 国产网站麻豆精品视频| 国产视频1区| 在线午夜视频| 免费国产阿v视频在线观看| 另类综合图区| 国产一级性片| 2020国产在线视频| 日本a级黄色| 日本韩国精品一区二区| 国产在线精品一区二区不卡| 老鸭窝av在线| 国产高清自拍视频在线观看| 天天草天天操| 最好2018中文免费视频| 国产精品18久久久久网站| 在线三级av| 高清色视频在线观看| 国产福利免费观看| 激情丁香婷婷| 中文一区在线观看| 国产女王在线**视频| 亚洲网站一区| 大香伊人中文字幕精品| 2021天堂中文幕一二区在线观| av在线不卡网站| 国产情侣高潮对白| 在线播放黄色网址| 国产蜜臀在线| av在线不卡播放| 91中文字幕| 国产极品嫩模在线视频一区| 二区三区中文字幕| www免费在线观看| 国产精品人人爱一区二区白浆| 欧美日韩视频精品一区二区| 国产午夜在线观看| 亚洲成人福利| 永久免费av片在线观看全网站| 天天操夜夜摸| 国产麻豆视频网站| 欧美一级久久久久久久久大| 国产精品入口免费麻豆| 欧美日韩**字幕一区| av在线1区2区| 欧美亚洲另类在线观看| www.三级.com| www.操.com| 久久国产精品久久久久久小说| 全网国产福利在线播放| 四虎在线免费视频| 青青草观看免费视频在线| 亚洲精品男人| xxx国产精品| 狠狠操狠狠色| 国产有码在线| 国产特级毛片| 国产午夜精品久久久久免费视| √天堂中文在线| 中文字幕在线播放网址| 国产视频中文字幕在线观看| 国产精品久久久高清免费| 国产精品视频一区二区免费不卡 | 国产丝袜自拍| 中文字幕av在线| 欧美日韩国产亚洲沙发| 久久av少妇| 国产福利小视频在线观看| 在线色视频网| 国产尤物视频| 国产精品冒白浆免费视频 | 黄色av网站在线免费观看| 国产精品天堂| 国产不卡精品一区二区三区| 亚洲а∨精品天堂在线| 久久精品视频免费看| 国产丝袜在线播放| www.xxx黄| 国产精品欧美韩国日本久久| 尤物视频在线观看视频| 高清欧美精品xxxxx在线看| 国产黄色网页| www.色五月| 中文字幕高清av| 香蕉视频在线看| 国产香蕉视频在线观看| 一区二区精品区| 成人日韩欧美| 日本福利午夜视频在线| 国产经典自拍视频在线观看| 蜜桃视频中文字幕| 尤物在线视频观看| 国产精品欧美韩国日本久久| 狠狠狠狠狠狠操| 在线黄色国产电影| 国产午夜精品久久久久免费视| xxxx视频在线| 日韩国产成人| 91视频黄色| 国产国产人免费人成免费视频| 黄色一级片视频| www免费在线观看| 三级小说一区| 天堂网中文在线| 伊人av免费在线观看| 2021av天天| 国产高清在线| 国产精品69xx| 精品999视频| 在线亚洲精品自拍| 99久久精品免费观看国产| 国产高清在线看| 国产成人精品实拍在线| 中文字幕亚洲精品视频| 国产蜜臀在线| 国产一级黄色电影| 成人超碰在线| 中文字幕高清av| 国产偷激情在线| 最近高清中文在线字幕在线观看 | 国产视频xxx| 精品一区二区三区在线观看l| 国产超级va在线视频| av免费网站在线观看| 快射av在线播放一区| 国产一二三区在线| 精品视频一二区| 中文字幕av在线| 久草网在线视频| 国产香蕉免费精品视频| 在线观看av的网站| 狠狠操狠狠色| 精品无人区乱码1区2区3区免费| av在线1区2区| 国产剧情在线一区| 91精品专区| 九七电影韩国女主播在线观看| 国产中文在线视频| 国产二区三区四区| 浪潮av一区| 在线黄色.com| 中文字幕乱在线伦视频乱在线伦视频 | 在线一区观看| 狠狠操视频网站| 在线āv视频| 国产香蕉在线| 欧美日韩视频精品二区| 91欧美在线视频| 1区2区3区在线|