亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

poj2104 k-th number 主席樹入門講解

2019-11-14 12:26:54
字體:
來源:轉載
供稿:網友

定義:主席樹是一種可持久化的線段樹 又叫函數式線段樹

剛開始學是不是覺得很蒙逼啊 其實我也是 

主席樹說簡單了 就是保留你每一步操作完成之后的線段樹 然后有可加減性

呃 。。。 這么說好像還是有點生澀

那么就拿poj2104來舉例子吧 慢慢講我覺得會很好的

題意就是給你一個100000長度的數字 然后100000次詢問[L,R]之間第k大的數字是多少

這個很容易看出來 暴力根本不可以 黑你分分鐘的事情啊 

我們怎么辦呢 想想線段樹能不能做 想來想去 一顆線段樹好像不能這么做 GG

那么我們做一個美好的假設:

我們建立100000棵美麗的線段樹 每一個線段樹的節點 表示這一個區間內有多少個數字

第一棵線段樹保存著把第一個數字插入進去之后 每個區間有多少個數字

第二棵線段樹保存著把第一個 第二個數字插入進去之后 每個區間有多少個數字

。

。

。

。

第n棵線段樹保存著把第1,2,3。。。。n個數字插入進去之后 每個區間有多少個數字

好了 我們已經建立了這么多的線段樹 我們接下來該怎么辦呢?

對 就是查詢 

可是如何查詢呢? 假設我們要查詢[l,r]內的第k大

我們可以拿出第l-1 ,r 棵線段樹,然后兩者相減 我們想一下 這樣不就得到了相當于插入了第l到r個點所建立的一棵線段樹 這棵線段樹每個節點保留的信息是:這個區間內數字的個數 然后我們往下二分查找 就可以得到第k大了

現在的問題時 這么龐大的空間開銷我們耗費不起 我們該如何建立這樣的線段樹呢?

答案就是 我們要盡量利用重復節點 

我們可以想一下 我們每次建立線段樹 相對于前一棵線段樹 我們只修改了它的一條路徑 最多只有logn的變化 那么我們就存下這logn的變化 盡可能的利用重復節點 就可以達到重復使用的目的 有張圖你們自己體會一下 我也是盜圖 侵刪~

每次只修改一條路徑

這樣就能完成我們的主席樹了 

接下來是我自己寫的該題代碼 

#include <iostream>#include <algorithm>#include <stdio.h>#include <string.h>#include <stdlib.h>using namespace std;#define maxn (int)(1e6+10)struct node{    int cnt,l,r;}treenode[30*maxn];//定義一個結構體吧 要不心累 l 和 r 表示 左右兩個節點的序號 這個不是單純的單個線段樹了 這個還是有必要的 最好開20-40倍int tree_cnt[maxn];//每個線段樹跟節點的坐標 這個是搜索的起點啊int init[maxn];//int cop[maxn];int n,t_cnt=0,newn;//t_cnt是現在數組開到多大了 然后建立下一個的時候注意++t_cnt;int getid(int x) {return (int)(lower_bound(init,init+newn,x)-init);}//數據太大 需要離散化int insert(int num,int becopyed,int l,int r)//記住返回自己的坐標{    ++t_cnt;    treenode[t_cnt].cnt=treenode[becopyed].cnt+1;    int save=t_cnt;    int mid=(l+r)/2;    if(l==r)    {        return save;    }    else if(num<=mid)    {        treenode[save].l=insert(num,treenode[becopyed].l,l,mid);        treenode[save].r=treenode[becopyed].r;    }    else    {        treenode[save].r=insert(num,treenode[becopyed].r,mid+1,r);        treenode[save].l=treenode[becopyed].l;    }    return save;}int query(int x,int y,int k,int l,int r){    if(l==r) return l;    int p=(treenode[treenode[y].l].cnt-treenode[treenode[x].l].cnt);    int mid=(l+r)/2;    if(k<=p)    {        return query(treenode[x].l,treenode[y].l,k,l,mid);    }    else return query(treenode[x].r,treenode[y].r,k-p,mid+1,r);}//一邊做減法 一邊查詢void PRint(int x,int l,int r){    cout<<treenode[x].cnt<<' ';    if(l==r) {return;}    int mid=(l+r)>>1;    print(treenode[x].l,l,mid);    print(treenode[x].r,mid+1,r);}int main(){    int n,qnum;    cin>>n>>qnum;    for(int i=0;i<n;++i) {scanf("%d",init+i);cop[i]=init[i];}    sort(init,init+n);    newn=unique(init,init+n)-init;    for(int i=1;i<=n;++i)    {        int p=insert(getid(cop[i-1]),tree_cnt[i-1],0,n);        tree_cnt[i]=p;        //cout<<p<<endl;    }    for(int i=0;i<qnum;++i)    {        int x,y,k;        scanf("%d %d %d",&x,&y,&k);        //cin>>x>>y>>k;        int ans=query(tree_cnt[x-1],tree_cnt[y],k,0,n);        //cout<<ans<<endl;        printf("%d/n",init[ans]);        //cout<<init[ans]<<endl;    }    //cout<<endl;    //for(int i=0;i<=n;++i) print(tree_cnt[i],0,n),cout<<endl;    return 0;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
疯狂欧美牲乱大交777| 精品国产乱码久久久久久虫虫漫画| 九九久久国产精品| 久久国产天堂福利天堂| 91成人在线观看国产| 亚洲国产精品久久| 成人激情春色网| 中文字幕亚洲字幕| 国产一区二区三区在线观看网站| 亚洲人成在线电影| 91色在线视频| 国产日产亚洲精品| 欧美美女操人视频| 欧美福利在线观看| 国产福利精品视频| 日韩在线视频观看正片免费网站| 日韩免费电影在线观看| 欧美午夜影院在线视频| 日韩在线视频网| 91视频九色网站| 国产精品网址在线| 国外色69视频在线观看| 欧美视频在线观看免费网址| www国产精品com| 欧美日韩精品二区| 欧美日韩国产精品一区二区不卡中文| 国产福利精品视频| 日韩高清电影免费观看完整| 久久久精品视频在线观看| 91九色蝌蚪国产| 狠狠躁夜夜躁人人躁婷婷91| 久久精品国产亚洲| 热久久99这里有精品| 日韩av中文在线| 日韩精品小视频| 亚洲日韩欧美视频| 亚洲男女性事视频| 色先锋久久影院av| 一区二区亚洲精品国产| 亚洲在线视频观看| 欧美黄色三级网站| 午夜精品福利视频| 久久久久久久久久国产| 国产精品视频网址| 午夜精品99久久免费| 久久精品99久久久久久久久| 国产激情视频一区| 深夜精品寂寞黄网站在线观看| 久久久久久久久久国产| 色妞色视频一区二区三区四区| 国产精品爽爽ⅴa在线观看| 国产97在线亚洲| 成人欧美一区二区三区黑人| 国产精品久久久久久久久久久久| 日本中文字幕久久看| 国产在线视频一区| 亚洲图中文字幕| 成人网欧美在线视频| 日韩av免费在线播放| 丝袜情趣国产精品| 亚洲黄在线观看| 欧美极品少妇全裸体| 亚洲网站视频福利| 97精品欧美一区二区三区| 久久久久久久久久久av| 97色在线视频| 日韩av在线免播放器| 亚洲精品一区在线观看香蕉| 国产91在线播放九色快色| 亚洲一级片在线看| 亚洲第五色综合网| 97人洗澡人人免费公开视频碰碰碰| 国产精品成人v| 国产精品美女午夜av| 亚洲福利视频在线| 在线观看久久av| www.欧美精品一二三区| 久久精品91久久久久久再现| 欧美日韩国产丝袜另类| 国产视频在线一区二区| 亚洲人成网站在线播| 欧美午夜精品久久久久久久| 日本亚洲精品在线观看| 亚洲天堂第一页| 懂色av中文一区二区三区天美| 中文综合在线观看| 欧洲亚洲女同hd| 亚洲国产91精品在线观看| 色偷偷888欧美精品久久久| 久久久久久久激情视频| 久久久久中文字幕| 中文字幕亚洲国产| 欧美成人免费va影院高清| 欧美成人国产va精品日本一级| 国产日产欧美a一级在线| 91精品在线观看视频| 日韩精品极品在线观看播放免费视频| 国产亚洲精品激情久久| 欧美成人黄色小视频| 欧美二区乱c黑人| 欧美国产日韩一区二区在线观看| 久久久精品一区二区三区| 成人一区二区电影| 欧美激情综合色| 久久久久久久久久久91| 日韩亚洲国产中文字幕| 欧美性生交大片免费| 日韩在线视频一区| 国产精品jizz在线观看麻豆| 色综合久久久久久中文网| 国产精品jizz在线观看麻豆| 岛国视频午夜一区免费在线观看| 91九色视频在线| 在线观看欧美日韩国产| 日日噜噜噜夜夜爽亚洲精品| 亚洲免费伊人电影在线观看av| 亚洲欧美日韩中文在线制服| 亚洲成人亚洲激情| 亚洲视频第一页| 精品久久久久久亚洲国产300| 久久久久久久久久久亚洲| 精品国产拍在线观看| 色www亚洲国产张柏芝| 欧美日韩午夜视频在线观看| 日韩影视在线观看| 麻豆国产va免费精品高清在线| 国产精品极品在线| 国产欧美va欧美va香蕉在线| 欧美体内谢she精2性欧美| 精品国产拍在线观看| 日韩福利在线播放| 日韩精品免费一线在线观看| 欧美一区视频在线| 中文字幕亚洲无线码在线一区| 亚洲自拍另类欧美丝袜| 国产精品久久久久久久久久新婚| 色小说视频一区| 成人444kkkk在线观看| 久久影院资源站| 久久久久久久成人| 一本一本久久a久久精品牛牛影视| 欧美性受xxxx黑人猛交| xxxx性欧美| 国内精品久久久久| 91免费的视频在线播放| 精品福利在线看| 国产精品成人免费视频| 亚洲影院色无极综合| 成人精品一区二区三区| 欧美成人在线免费| 青青草精品毛片| 国产精品久久久久久久av大片| 亚洲一区二区三区四区在线播放| 亚洲精品wwww| 91精品国产777在线观看| 亚洲成年网站在线观看| 亚洲国产精久久久久久久| 欧美午夜丰满在线18影院| 国产精品扒开腿爽爽爽视频| 国产丝袜一区二区三区| 久久久国产91| 日韩一区二区久久久| 日韩电影免费在线观看中文字幕| 欧美中文在线观看国产|