清華月賽 Yazid的新生舞會題解

2021-08-11 08:30:51 字數 1719 閱讀 6708

考慮列舉所有區間,然後求其眾數及出現次數,並判斷是否超過區間總長的一半,統計答案即可。時間複雜度o(

n3)

考慮先列舉區間的左端點

l ,再從左到右列舉右端點

r並用陣列維護每個數的出現次數,同時使用變數維護當前眾數、眾數的出現次數。不難發現,當右端點向右移動時,這些資訊都是非常方便維護的。於是我們便可以在o(

n2) 的時間複雜度內統計所有答案。

對於01

序列,我們不難發現,眾數出現次數嚴格大於子區間長度當且僅當子區間內0,

1 出現次數不同(那麼那個出現次數較多的就是眾數)。於是我們將原序列中的

0 視作−1

,並對該序列求字首和

s ,則子區間[l

,r]為「新生舞會的」,當且僅當sl

−1=s

r ,因此對

s 進行排序並從小到大列舉便可求出答案。

對於所有數的出現次數都較小(不超過

15 )的情況,不難發現所有「新生舞會的區間」的長度也會較小(不超過2×

15−1=

29 )。於是使用演算法二,列舉所有長度少於

30 的區間並統計答案即可。對於a

i≤7 的測試點,我們不妨列舉所有值作為眾數的情況。考慮統計所有眾數為

k 的「新生舞會的」區間,將所有等於

k的位置取為

1 ,不等於

k的位置取為−1

,得到新序列

b 並求字首和得到序列

s,則區間[l

,r] 需要被統計,當且僅當sr

−sl−

1≥1 。從左到右列舉右端點,並用線段樹維護當前右端點左邊每種字首和出現的次數即可。時間複雜度o(

8nlo

gn)

考慮改進演算法五。我們考慮取出所有

b 中的極長−1

子區間,觀察這些區間中的所有點作為右端點對答案的貢獻。不難發現極長−1

子區間[l

,r] 中的所有點作為右端點對答案的貢獻為∑r

−l+1

i=1∑

sl−1

−i−1

j=−∞

cnt[

j],其中cn

t[j]

表示在區間[0

,l−1

] 之間字首和為

j 的端點數目;在統計這段區間的答案後,我們還需要對區間[s

i−1−

(r−l

+1),

si−1

−1]中的所有cn

t 均進行+1

操作。顯然地,我們使用乙個維護bi

和ci=

i×bi

的線段樹就可以支援這些查詢、修改操作。於是我們使用這棵線段樹維護相關資訊,並從左到右列舉右端點,統計答案即可。

不難發現,極長−1

子區間的數目與序列中

k 的數目同階,因此,對於統計眾數為

k的「新生舞會的」區間的時間開銷,不難發現我們通過上述優化將時間開銷縮短到了o(

序列a中

k的數目

logn

) 於是,總時間複雜度即為o(

∑k序列

a中k的

數目lo

gn) ,即o(

nlog

n)。對於常數較大的與標準演算法時間複雜度相同的演算法,以及一些時間複雜度略大於標程的演算法,可能存在無法通過所有測試點的情況。這類演算法可以通過這類測試點。

題解 Code 1 Yazid 的新生舞會

upd cnt i 代表值為 i 的個數 我們可以暴力列舉眾數 k 把等於 k 的賦值成 1 不等於 k 的賦值成 1 這樣原序列就變成了一段折線 我們把他剖開一段一段來分析 這些藍線的左右端點分別為,乙個值為眾數的數的位置,和它下乙個值為眾數的數的位置的前乙個位置 為了方便,我們定義 0 n 1 ...

長安大學新生賽 H題 拉麵女神的魔盒

再簡單說明一下題意,規定一開始按鈕狀態為0 0 0 0 0 0,輸入終點狀態,求最少的操作步數,對於每個按鈕,有以下規定 按鈕 可以任意想順時針或者逆時針旋轉,一次轉動一格 按鈕 當6個旋鈕的數字中奇數偶數個數為相同時才能轉動,向順時針或者逆時針轉動一格 按鈕 只能向逆時針方向轉動,一次轉動7格。按...

GDUT 2016新生賽D題 有趣的遊戲

巴什博弈 只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每次至少取乙個,最多取m個。最後取光者得勝。顯然,如果n m 1,那麼由於一次最多只能取m個,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後者取勝。因此我們發現了如何取勝的法則 如果n m 1 r s,r為任意自然數,s m...