2019 10 6 機房訓練賽

2022-07-24 19:48:14 字數 1466 閱讀 9619

一道優先佇列或是線段樹,一道找性質

t1:

題面:

眾所周知,九條可憐家裡有礦。

你可以把可憐家的礦場抽象成一條數軸。可憐家有nn種礦,第ii種礦可以從[li,ri]的任意位置開採得到。

這個暑假,地理老師給了可憐乙個列表:可憐的暑假作業就是收集齊這些礦石。為了保證可憐的安全,可憐的爸爸選定了m個相對安全的採礦點,第ii個採礦點的座標為ai。可憐只能選擇其中乙個採礦點開採她需要的礦石。

可憐是乙個馬虎的女孩子。暑假剛開始沒多久,可憐就把老師的列表弄丟了。唯一的線索是,列表上的所有礦石都是可憐家有的:一共有2n−12n−1種可能的列表。

可憐現在想要知道,在所有的可能的任務列表中,有多少種是她能夠在某乙個安全的採礦點完全收集齊的。

題解:

自己被自己的想法卡了,哇,hanpilkx,考慮怎麼處理重複的情況,如果有容斥的話,就是把每乙個採礦點分開來看了,然而並不用,完全可以把之前的貢獻計入當前採礦點,對於維護區間資訊求求你想想線段樹好嗎?

對於重複的區間,我們就區間減1,然後當前採礦點的貢獻就是2^(總)-2^(-1),當然也可以用差分轉換為單點修改,把 l -1,r+1 +1;

當然還有一種是優先佇列的寫法,大致思路同上(感覺就是暴力????)

t2:

題面:

可憐不喜歡括號序列,但是她發現總是有人喜歡出括號序列的題。

為了讓全世界都能感受到她的痛苦,她想要寫乙個轉換器:它能把普通的小寫字串轉換成長度相同的合法的括號序列。

在可憐的構思中,這樣的轉換器需要滿足如下兩個條件:

1.結果的括號序列必須要是合法的,即左右括號必須要是相匹配的。

2.對於一堆相匹配的左右括號,他們所在的位置原來的小寫字母必須相同。

舉例來說,對於字串aabaab,()(())就是乙個合法的答案,而()()()不滿足第二個條件,  (((())不滿足第乙個條件。

可憐發現對於乙個小寫字串,有時候有很多滿足條件的括號序列,有些時候乙個都沒有。

於是可憐給出了乙個小寫字串,她想讓你幫她算一下,有多少個不同的子串滿足能轉換成合法的括號序列。

題解:

首先暴力就是列舉棧底(也可以理解為左端點),然後就像普通括號匹配去做,遇到一樣的就彈棧,不一樣就加進來,如果棧地為空則表明匹配成功,注意!!!這道題有字母的限制所以不能全部hash成括號

時間複雜度 o(n^2)

考慮優化,注意到乙個性質:當棧中元素在不同次彈棧後是一樣的,就說明這兩個位置之間的序列是滿足條件的,那麼遇到連續的就統計(兩個兩個的匹配就是n*(n-1)/2)

機房聯考訓練賽

這道題思路很好想 但是實現實在是困難 主要是對於部分c的資訊沒有給出時 進行最小的字典序貪心處理 以及對於列舉的右端點在處理後的區間外部時 要進行特判,否則會將原本用來佔位的位置算作貢獻 不過這道題的資料特別水 我也沒有特判什麼就對了?還有同學在找字典序最小的串時都寫錯了 但是還是a了 下面放 in...

dirty機房訓練賽 chess

開始以為是矩陣快速冪之類的題 沒想到居然是dp 不過其實也快想到了 不過關於最後剩下的幾排出現了誤區 他們實際上也應該與前面一樣的 轉移十分合理到位 也就不多說了 這是我的優美 includeusing namespace std const int mod 1e9 7 int n,c,fac 50...

訓練 9 13 訓練賽

a.hdu 6230 乙個合法的子串 s 3n 2 滿足條件即1 2n 1 為以n為回文中心的回文串,n 3n 2為以2n 1為中心的回文串。故我們可以通過尋找回文中心對,來判斷相應合法子串的個數。利用manacher求出每個位置的最長回文半徑,則若i,j滿足條件 i j 則應有 p i geqsl...