poj 2401 劃分樹 求區間第k大的數

2021-06-22 04:16:46 字數 1101 閱讀 2982

題目:

劃分樹待我好好理解下再寫個教程吧,覺得網上的內容一般,,,

模板題:

貼**:

#include #include #include #include using namespace std;

#define clr(a) memset(a,0,sizeof(a))

const int maxn = 100010;

struct node

int mid()

bool in(int ll,int rr)

void lr(int ll,int rr)

}node[maxn*4];

int num_left[20][maxn],seg[20][maxn],sa[maxn];

//sa陣列存sort後的結果

//seg陣列存的是d層劃分後的數字 (類似快排partation (d-1)次後的結果)

//num_left存的是d層在i之前(包括i)小於 sa[mid] 的數的數目

void init()

void pabuild(int t,int l, int r,int d)

if(seg[d][i] > sa[mid])

seg[d+1][rpos++] = seg[d][i];

if(seg[d][i] == sa[mid])

if(lsame > 0)// 如果大於0,說明左側可以分和sa[mid]相同的數字

else //反之,說明左側數字已經分滿了,就分到右邊去

seg[d+1][rpos++]=seg[d][i];

}pabuild(t*2,l,mid,d+1);

pabuild(t*2+1,mid+1,r,d+1);

}void build(int s,int t)

int find_rank(int t,int l,int r,int d,int val)//val指的是k

}int query(int s,int t,int k)

int main()

build(1,n);

while(m--)

}return 0;

}

劃分樹 求區間K大數

求區間k大數,眾所周知有二分答案 樹套樹的做法,每個詢問複雜度為o log3n 可謂近似乙個o n 了,不僅時間複雜度高,程式設計複雜度也不低,後來才發現還有一種叫劃分樹的資料結構,專門做這種問題。本來覺得知道個樹套樹就夠了,據我所知劃分樹還不支援區間修改操作,但是這次noi一試的piano偏偏那出...

poj2104 劃分樹問題

這個題目的意思是給你乙個區間,讓你找到在某個給出的子區間當中第k大的數。這是我的第乙個劃分樹題目,因為之前做了好多線段樹的題目了,看了看書上基本的 然後按照自己的思路寫了出來。按照這個題目的思路,得用到二分,把給出的元素x n 排好序y n 對於乙個給出的子區間,那麼第k大的元素應該滿足兩點 1 在...

靜態區間第k大(劃分樹)

poj 2104為例 經典劃分樹問題 思想 利用快速排序思想,include include using namespace std const int maxn 100010 int tree 20 maxn 每層每個位置的值 int sorted maxn 排好序的陣列,方便尋找中值 int l...