洛谷 P5658 括號樹(DFS)

2022-04-06 17:38:01 字數 1118 閱讀 7979

通過資料範圍可以發現,這個題的複雜度要控制在o(n)~o(nlogn)之間。

所以對於每一次處理,需要o(logn),甚至o(1)。對於o(1)的處理,可以直接想一下找規律:

如果乙個右括號能匹配左括號,且左括號的前乙個括號是乙個已經匹配了的右括號,那麼就可以將這兩個序列合併,當前右括號的貢獻等於前乙個右括號的貢獻加一。如果沒有這種情況的話,那麼貢獻肯定是從1開始的(只於前面的那個左括號有貢獻,前面的都會被左括號的前乙個所斷絕)。

注意回溯。

ac**:

1 #include2 #include3 #include4 #include5

using

namespace

std;

6 typedef long

long

ll;7

const

int n=500005;8

intn;

9int

head[n],fa[n],tot;

10char

c[n];

11ll lst[n],ans,sum[n];

12 stackst;

13struct

nodeedge[n];

16void add(int u,int

v)21

void dfs(int

u)29}30

else

if(c[u]=='('

) st.push(u);

31 sum[u]=sum[fa[u]]+lst[u];

32for(int i=head[u];i!=-1;i=edge[i].next)

36if(t!=0

) st.push(t);

37else

if(!st.empty()) st.pop();38}

39int

main()

49 dfs(1

);50

for(int i=1;i<=n;i++) ans^=sum[i]*(ll)i;

51 printf("

%lld\n

",ans);

52return0;

53 }

ac**

CSP S 2019 洛谷P5658 括號樹

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

P5658 括號樹 貪心

miku so crazy 因為把stack的型別寫成bool 把自己搞自閉了 思路,顯然如果乙個點是 那麼不會有貢獻,只要壓入佇列,答案繼承父親就行了 如果是 如果能匹配,就判斷 的父親是什麼,如果是 那麼顯然把根節點到 的父親的序列中與剛匹配的 相接的部分加上剛匹配的 也是合法的 不考慮剛匹配的...

單向DFS 洛谷P1101

這題跟以往的dfs不同的是,它是單向的dfs 因為我做題少,所以第一次見到這種型別的題目 思路很簡單,但是對於第一次做這種單向dfs的我來說 我蒻 開始確實感覺無從下手。這道題目和以往的dfs不同的地方在於,dfs的方向是在外面判斷的,然後還要記錄路徑,路徑記錄全了才能往vis裡面加true。直接看...