題目:
劃分樹待我好好理解下再寫個教程吧,覺得網上的內容一般,,,
模板題:
貼**:
#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...