資料結構 主席樹 COGS 2211 談笑風生

2022-03-30 15:32:12 字數 1778 閱讀 5302

★★★★   輸入檔案:laugh.in輸出檔案:laugh.out簡單對比

時間限制:3 s   記憶體限制:512 mb

【問題描述】

設t 為一棵有根樹,我們做如下的定義:    

• 設a和b為t 中的兩個不同節點。如果a是b的祖先,那麼稱「a比b不知道高明到**去了」。    

• 設a 和 b 為 t 中的兩個不同節點。如果 a 與 b 在樹上的距離不超過某個給定常數x,那麼稱「a 與b 談笑風生」。

給定一棵n個節點的有根樹t,節點的編號為1 n,根節點為1號節點。你需要回答q 個詢問,詢問給定兩個整數p和k,問有多少個有序三元組(a; b; c)滿足: 

1. a、b和 c為 t 中三個不同的點,且 a為p 號節點;    

2. a和b 都比 c不知道高明到**去了;    

3. a和b 談笑風生。這裡談笑風生中的常數為給定的 k。

【輸入格式】

輸入檔案的第一行含有兩個正整數n和q,分別代表有根樹的點數與詢問的個數。接下來n-1行,每行描述一條樹上的邊。每行含有兩個整數u和v,代表在節點u和v之間有一條邊。接下來q 行,每行描述乙個操作。第i行含有兩個整數,分別表示第i個詢問的p和k。

【輸出格式】輸出 q 行,每行對應乙個詢問,代表詢問的答案。

laugh.in 

5 31 2

1 32 4

4 52 2

4 12 3

laugh.out31

3這道題目一看就是要用某種資料結構的。

觀察它的詢問:有兩類情況

①:b點是a點祖先,可以o(1)求出答案。

②:b是a子樹中的乙個節點,我們可以用dfs序,那麼b點所在子樹就是dfs序列中連續的一段,考慮對子樹分層,接著用主席樹水過了。

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;

6const

int maxn=300010;7

int cnt,fir[maxn],nxt[maxn<<1],to[maxn<<1];8

void addedge(int a,int

b)13

intdep[maxn],sz[maxn],id[maxn],end[maxn],tot;

14void dfs(int

node)

22 end[node]=tot;23}

24 queueq;

25int rt[maxn],ch[maxn*30][2

],cont;

26long

long tr[maxn*30

];27

void insert(int pre,int &rt,int l,int r,int

g)37

long

long query(int pre,int rt,int l,int r,int a,int

b)45

intmain()

55 dep[1]=1

;56 dfs(1

);57 q.push(1

);58

int maxd=0;59

while(!q.empty())67}

68int

a,k;

69long

long

ans;

70while(q--)

76return0;

77 }

資料結構 主席樹

1.p3919 模板 可持久化線段樹 1 可持久化陣列 include define mkp make pair define pb push back define v t vector define all x x.bg,x.ed define newline puts define si x ...

主席樹 資料結構的克星

1.主席樹 又叫可持續化線段是,因為每次對主席樹的修改,都會重新建立一棵新的數,保留這沒修改之前的歷史紀錄,所以叫可持久化線段樹,她是以線段樹為基礎建立的多棵樹,每棵樹代表著乙個歷史階段,它與線段樹的儲存結構稍微有點不同,就是線段是的左右兩個孩子與根節點都存在這x2,x2 1的關係,而主席樹的根節點...

可持久化資料結構之靜態主席樹

參考部落格 前言 如果完全掌握了主席樹的前置知識,主席樹其實也是一種並不算很難的資料結構 雖然蒟蒻還是花了好久 主席樹主要的前置知識就是權值線段樹,一旦理解了權值線段樹的相關知識,那麼主席樹的學習應該也會變得較為簡單。權值線段樹是線段樹的一種,但是它與普通線段樹不同的地方在於,普通線段樹節點的區間代...