P5658 括號樹 貪心

2022-04-06 14:38:45 字數 831 閱讀 1605

miku

so crazy

因為把stack的型別寫成bool 把自己搞自閉了

思路,顯然如果乙個點是(,那麼不會有貢獻,只要壓入佇列,答案繼承父親就行了

如果是),如果能匹配,就判斷(的父親是什麼,如果是),那麼顯然把根節點到)的父親的序列中與剛匹配的()相接的部分加上剛匹配的()也是合法的

不考慮剛匹配的()也是合法的,新括號自己也合法,不是的話顯然只有(父親的加上剛匹配的合法

然後從上往下搜尋即可

記得處理邊界

#include#include#includeusing namespace std;

int v[500001];

int head[500001];

int ans[500001];

int fa[500001];

struct be[500001];

int p;

stack s;//記得long long

int n;

char c;

int x;

void add(int f,int to)

void dfs(int f,int now)elseelse

}else

} }for(int i=head[now];i;i=e[i].ne)

if(fl)else

return ;

}int main()

for(int i=1;idfs(0,1);//其實這一變數沒必要

for(int i=1;i<=n;++i)

cout

}

洛谷 P5658 括號樹(DFS)

通過資料範圍可以發現,這個題的複雜度要控制在o n o nlogn 之間。所以對於每一次處理,需要o logn 甚至o 1 對於o 1 的處理,可以直接想一下找規律 如果乙個右括號能匹配左括號,且左括號的前乙個括號是乙個已經匹配了的右括號,那麼就可以將這兩個序列合併,當前右括號的貢獻等於前乙個右括號...

CSP S 2019 洛谷P5658 括號樹

本題中合法括號串的定義如下 是合法括號串。如果a是合法括號串,則 a 是合法括號串。如果a,b是合法括號串,則ab是合法括號串。本題中子串與不同的子串的定義如下 4.字串s的子串是s中連續的任意個字元組成的字串。s的子串可用起始位置 l 與終止位置 r 來表示,記為 s l,r 1 leq l le...

Luogu P5658 括號樹 搜尋 遞推

csp2019 s組d1t2 題目鏈結 題目大意 一棵樹上每個節點有 或 根到每個節點的路徑可形成一括號串,求根到每個節點形成的括號串的合法括號字串個數,取異或和。解析 該題為csp2019提高組容易拿分的一道。選擇寫鏈是個不錯選擇 然後我就這裡打掛了 70pts 正解其實在考場上也能想出。子串說明...