可持久化線段樹求區間第k大

2022-08-22 16:36:15 字數 1751 閱讀 6052

老爺口諭,有n個數-10^9<=n<=10^9,每個數的範圍在[0,10^5],給定m個詢問,每次詢問區間[l,r]的第k小值

可持久化線段樹,舔的老爺的模板

1 #include2 #include3

using

namespace

std;

4#define maxn 100005

5int

val[maxn],hash[maxn],hh;

6int tree[maxn*20],root[maxn*20],rson[maxn*20],lson[maxn*20

],tot;

7void build(int x,int &y,int l,int r,int

v)15

else19}

20int query(int x,int y,int l,int r,int

k)26

intmain()

34 sort(hash+1,hash+hh+1

);35 hh=unique(hash+1,hash+hh+1)-(hash+1

);36

for(int i=1;i<=n;i++)

40for(int i=1;i<=m;i++)

44return0;

45 }

view code

lca+可持久化線段樹,yooo~

1 #include2 #include3

using

namespace

std;45

#define maxn 100005

6int cnt,v[maxn<<1],next[maxn<<1

],first[maxn];

7int dep[maxn],f[maxn][25

],val[maxn],hash[maxn],hh;

8int tree[maxn*20],root[maxn],lson[maxn*20],rson[maxn*20

],tot;910

void add(int st,int

end)

15void build(int x,int &y,int l,int r,int

v)23

else27}

28void dfs(int

x)36}37

}38int query(int a,int b,int c,int d,int l,int r,int

k)44

int lca(int a,int

b)57

intmain()

65 sort(hash+1,hash+1+hh);

66 hh=unique(hash+1,hash+1+hh)-(hash+1

);67

for(int i=1;i<=n;i++)

68 val[i]=lower_bound(hash+1,hash+1+hh,val[i])-hash;

69for(int i=1;i)

73 dfs(1

);74

for(int j=1;(1

75for(int i=1;i<=n;i++)

76 f[i][j]=f[f[i][j-1]][j-1

];77

for(int i=1;i<=m;i++)

85return0;

86 }

view code

可持久化線段樹 Step 1 靜態區間第K大

考慮這樣乙個問題 給出一段長度為n序列 對於一些詢問 請輸出序列上 l r 內第k大的數。關於暴力做法,其實是很簡單的,但是會超時,在此略過。有一種辦法,是利用字首和的思想。先將 離散到區間 1 n 然後,對於任意節點 i 都建立一棵權值線段樹,代表離散後 在權值區間 1 n 出現的次數。這樣,對於...

可持久化線段樹總結(可持久化線段樹,線段樹)

最近正在學習一種資料結構 可持久化線段樹。看了網上的許多部落格,弄了幾道模板題,思路有點亂了,所以還是來總結整理下吧。你需要維護這樣的乙個長度為 n 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操作2,即為生成乙個完全一...

可持久化線段樹

可持久化線段樹,意思是可以查詢歷史記錄的線段樹。又叫主席樹。我們可以通過記錄不同的根節點,並在每乙個更新到的節點處新建必要的節點。詢問不同版本的主席樹,只需要進入不同的根節點即可。例題 給定n,m,輸入n個數組成的數列,有m個詢問,每次詢問l,r這個區間中,第k小的數的值。分析 這個題可以巧妙運用主...