倍增查詢表
區間查詢,單點多層次查詢,求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 表示...