給定乙個值
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 當佇列中沒有元素時稱為空佇列。佇列的修改是依先進先出的原則進行的。新來的成員總是加入隊尾 即不允許 加塞 每次離開的成員總是...