資料結構 ST表

2021-09-25 15:25:37 字數 1815 閱讀 1319

倍增查詢表

區間查詢,單點多層次查詢,求lca

倍增思想,能夠快速向上推進查詢。

void

init()

intquery

(int a,

int b)

// lca模板

bzoj-1787 meet 緊急集合

description

歡樂島上有個非常好玩的遊戲,叫做「緊急集合」。在島上分散有n個等待點,有n-1條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。

參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上(每個點同時允許多個人等待),每個人均帶有足夠多的遊戲幣(用於支付使用道路的花費)、地圖(標明等待點之間道路連線的情況)以及對話機(用於和同組的成員聯絡)。當集合號吹響後,每組成員之間迅速聯絡,了解到自己組所有成員所在的等待點後,迅速在n個等待點中確定乙個集結點,組內所有成員將在該集合點集合,集合所用花費最少的組將是遊戲的贏家。

小可可和他的朋友邀請你一起參加這個遊戲,由你來選擇集合點,聰明的你能夠完成這個任務,幫助小可可贏得遊戲嗎?

input

第一行兩個正整數n和m(n<=500000,m<=500000),之間用乙個空格隔開。分別表示等待點的個數(等待點也從1到n進行編號)和獲獎所需要完成集合的次數。 隨後有n-1行,每行用兩個正整數a和b,之間用乙個空格隔開,表示編號為a和編號為b的等待點之間有一條路。 接著還有m行,每行用三個正整數表示某次集合前小可可、小可可的朋友以及你所在等待點的編號。

output

一共有m行,每行兩個數p,c,用乙個空格隔開。其中第i行表示第i次集合點選擇在編號為p的等待點,集合總共的花費是c個遊戲幣。

sample input

6 41 2

2 32 4

4 55 6

4 5 6

6 3 1

2 4 4

6 6 6

sample output

5 2 

2 5

4 1

6 0

其實就是lca裸題啦,先求兩個點的lca再與第三個點求一次lca,然後在三種取法裡選乙個最小的。

#include

#include

#include

#include

using

namespace std;

const

int maxn =

5e5+10;

int st[maxn][25

];int u[maxn*2]

, v[maxn*2]

, to[maxn*2]

, sn[maxn]

, dex =

0, dep[maxn]

;int m, n;

inline

intread()

while

('0'

<= ch && ch <=

'9')

return x * f;

}void

addedge

(int a,

int b)

void

bfs(

int a,

int fa,

int dpt)

lo = to[lo];}

}void

init()

intquery

(int a,

int b)

intmain()

}

資料結構 ST表

只遞推狀態空間在2的整數次冪位置上的值作為代表。當需要其他位置的值時,我們通過 任意整數可以表示成若干個2的次冪項的和 這一性質,使用之前求出的代表值拼出所需要的值。狀態空間關於2的次冪具有可劃分性 1 int power int a,int b,int p 2 10 return ans 11 快...

模板 資料結構 ST表 二維ST表

區間最大值,o nlogn 預處理,o 1 查詢,不能動態修改。在查詢次數m顯著大於元素數量n的時候看得出差距。令 f i j 表示 i,i 2 j 1 的最大值。顯然,f i 0 a i 根據定義式,寫出狀態轉移方程 f i j max f i j 1 f i 2 j 1 我們可以這麼理解 將區間...

資料結構學習筆記 ST表

rmq range mininum maxnum query 即區間最值查詢。對於長度為 n 的陣列 a 有若干次詢問 rmq i,j 回答下標區間 i,j 內的最大 最小值。st表可以很好地解決此類問題,預處理複雜度 o nlogn 查詢 o 1 設 a i 是要求區間最值的陣列,f i j 表示...