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)