通過資料範圍可以發現,這個題的複雜度要控制在o(n)~o(nlogn)之間。
所以對於每一次處理,需要o(logn),甚至o(1)。對於o(1)的處理,可以直接想一下找規律:
如果乙個右括號能匹配左括號,且左括號的前乙個括號是乙個已經匹配了的右括號,那麼就可以將這兩個序列合併,當前右括號的貢獻等於前乙個右括號的貢獻加一。如果沒有這種情況的話,那麼貢獻肯定是從1開始的(只於前面的那個左括號有貢獻,前面的都會被左括號的前乙個所斷絕)。
注意回溯。
ac**:
1 #include2 #include3 #include4 #include5ac**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 }
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。直接看...