JLOI2012 樹 佇列和棧

2021-07-22 19:26:07 字數 1022 閱讀 5020

給定乙個值

s 和一棵樹。在樹的每個節點有乙個正整數,問有多少條路徑的節點總和為

s。路徑中節點的深度必須是公升序的。假設節點1是根節點,根的深度是0,它的兒子節點的深度為1。路徑不必一定從根節點開始。

我們可以維護這樣乙個資料結構,他的前半部分是乙個保留原來資訊的佇列

後半部分是乙個棧

dfs一遍,當深搜到乙個點時將這個點加入佇列,同時隊頭向後調整,使佇列中元素之和

<=

s ,等於

s 記錄 an

s。 當乙個點出棧時將隊尾刪除,同時隊頭向前調整,使佇列中元素之和剛好

<=s

這算是棧和佇列的結合使用了……

#include 

#include

#include

#include

#define n 100000+5

#define m 200000+5

using namespace std;

int n,r,h,s;

int a[n],q[n],fa[n];

int head[n];

struct graph

graph(int _next, int _to)

: next(_next), to(_to) {}

} edge[m];

inline void add(int

x, int

y)int sum;

int ans ;

void dfs(int

x) sum-=q[r--];

while(h && sum + q[h]

<=s)

sum += q[h--];

}inline int

read()

while(ch >='0' && ch <='9')

return

x*f;

}int main()

dfs(1);

cout<}

JLOI 2012 樹(樹上倍增)

傳送門 solution 考慮倍增,維護up和w陣列,up i j 代表i節點向上跳2 j能到達的節點,w i j 代表i節點及其以上2 j的和,一遍dfs,常規倍增處理即可。特別地,w i 0 的值不是val father 而是val i include define n 100005 using...

棧和佇列 單調佇列 單調棧

講解部落格鏈結 一 單調棧 1 什麼是單調棧?單調棧是指乙個棧內部元素具有嚴格單調性 單調遞增,單調遞減 的一種資料結構。2 單調棧的兩個性質 滿足從棧頂到棧底具有嚴格的單調性 滿足後進先出的特徵,越靠近棧底的元素越早的進棧。3 元素進棧的過程 對於當前進棧元素x 如果x 棧頂元素,x 進棧。否則 ...

棧和佇列 佇列

佇列 又一種特殊的線性表 佇列 queue 是只允許在一端進行插入,而在另一端進行刪除的運算受限的線性表 允許刪除的一端稱為隊頭 front 允許插入的一端稱為隊尾 rear 當佇列中沒有元素時稱為空佇列。佇列的修改是依先進先出的原則進行的。新來的成員總是加入隊尾 即不允許 加塞 每次離開的成員總是...