1. 程式人生 > >Codeforces Round #423(div 2)

Codeforces Round #423(div 2)

以及 並查集 序列 可能 字符 時間復雜度 距離 子串 是否

A

=w=

B

QvQ

C(並查集)

題意:

你需要根據要求構出一個字符串S

輸入n個子串以及這些子串在S中出現的位置(有多個位置),輸入數據保證不沖突

然後你根據這些已知子串去構一個字典序最小的S(也就是沒涉及的位置填‘a‘)

最終S的總長度<=2e6

分析:

不能直接暴力模擬,那樣會TLE

給位置塗色的過程中將相鄰的塊用並查集合並,父親是當前塊最右邊的那個位置

這樣就可以保證每個位置最多遍歷一次了

時間復雜度O(αlen)

D(構造)

題意:

給出n,k(n,k<=2e5)

可以構造出一個n個點的無根樹,並且這個無根樹葉子節點的個數是k

那麽在這麽些合法的樹中,你需要找出一個樹,葉子節點之間距離的最大值最小

分析:

我們希望它們之間的距離越平均越好

容易發現從根節點分出k個枝杈,然後每個枝杈盡可能平均地掛鏈,這樣的樹可以使得葉子節點之間距離的最大值最小

E(樹狀數組)

題意:

給出一個由A G C T組成的字符串S(|S|<=1e5)

有q(q<=1e5)個操作:

  操作1:將一個位置的字符修改

  操作2:讀入l,r,e,e是一個長度<=10的字符串。字符串T=S[l..r],字符串E=eeeeeeeeeeee....,將T和E對比,計算有多少個位置i滿足T[i]=E[i]

分析:

首先考慮沒有修改操作

對於詢問可以枚舉e的每一位,那麽就是詢問一個等差序列與原串S對應位置的重合情況

可以對原串S預處理,數組c[id][i][j][]表示對於字符id,當公差是i的時候(明顯公差<=10),首項是j的時候(j<=i),每個位置是否有字符id(0或者1)

那麽對於詢問其實就是求區間和,那麽就求前綴和相減就行了

現在考慮修改操作

修改操作是:修改一個位置,詢問區間和

所以直接BIT

時間復雜度O(4*10*10*len*log(len))

F

待填坑

Codeforces Round #423(div 2)