考慮列舉所有區間,然後求其眾數及出現次數,並判斷是否超過區間總長的一半,統計答案即可。時間複雜度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...