真正的題目 in luogu
題目背景(與題目無關,可跳過)
機房裡的 12
1212
人陪審團將要投票決出,誰是最可愛的妹妹。
有三位參選者:炎一鳥、周相未、木雨(姓名已經匿名化處理),得票分別是 3,4
,5
3,4,5
3,4,5 。
於是「木雨」當選。這似乎很合理。不過有趣的是,有多達 7
77 個人不想讓「木雨」當選,這已經超過了半數!
不妨假設「炎一鳥」被人咬了,得了 「狂人病」 ,住院**,未能參與選舉。這一次,「周相未」得到了 7
77 票,成功當選——因為選擇「炎一鳥」的人對「木雨」深惡痛絕,他們傾向於讓「周相未」勝利。同樣的 12
1212
個人,選舉結果卻由乙個得票最少的參選者決定!
題目描述
有 n
nn 個人,第 i
ii 個人投票給了第 a
ia_i
ai 個參選者。有 q
qq 次詢問:如果只讓 [l,
r]
[l,r]
[l,r
] 範圍內的人投票,誰得到的票最多?如果有多個人都是得票最高,輸出 「 dra
w\rm draw
draw
」 。資料範圍與提示
max (
n,q)
≤3×1
05
\max(n,q)\le 3\times 10^5
max(n,
q)≤3
×105
,而參選者數量高達十億!(即 109
10^9
109如果是絕對眾數(超過一半),我們還可以玩點花樣。一般的眾數,我們有什麼好演算法嗎?
於是考慮分塊。即使看到這裡,我相信,有很多人還是不會,比如我自己。這跟分塊有什麼關係嗎?
adv用 f(lic
eadvice
advice
:充分地考慮一下分塊的作用,然後接著往下看。說實話,我自己都沒想明白。
,r
)f(l,r)
f(l,r)
存從第l
ll個塊到第r
rr個塊的眾數,順便存乙個出現次數。對於每乙個 l
ll 暴力從小到大移動 r
rr 即可預處理。複雜度 o(b
n)
\mathcal o(bn)
o(bn
)(好習慣:暫時用 b
bb 代表塊的數量)。
那麼,對於乙個詢問,它包含了塊 l∼r
l\sim r
l∼r 和一些邊角料。眾數只有兩種情況:沒有在邊角料裡出現過,或者出現過。對於第一類,顯然就是 f(l
,r
)f(l,r)
f(l,r)
嘛!對於第二類,我可以列舉這個眾數,因為它只有塊長 o(n
b)
\mathcal o()
o(bn)
個。我能不能求乙個數出現的次數呢?當然可以。沒有修改操作,完全可以離散化 a
aa 的取值,下面就認為值域為 n
nn 了。對於每種 a
aa,求 s(i
,a
)s(i,a)
s(i,a)
表示前i
ii個塊內a
aa 出現的次數。邊角料中的出現可以用桶直接計數。o(b
n)
\mathcal o(bn)
o(bn
) 預處理 s
ss 之後,每次詢問要 o(n
b)
\mathcal o()
o(bn)
統計邊角料,然後可以 o(1
)\mathcal o(1)
o(1)
查詢每個數字出現次數。直接與 f
ff 得到的結果作比較就行。
總複雜度
o (q
nb+b
n)≥o
(nn)
\mathcal o\left(+bn\right)\ge\mathcal o(n\sqrt)
o(bqn
+bn)
≥o(n
n)取 b=n
b=\sqrt
b=n
有一種更奇怪的想法,竟然也是 o(n
n)
\mathcal o(n\sqrt)
o(nn)
的,利用的就是最終眾數出現次數與f
ff差值不超過n
\sqrt
n。為啥呢?假設邊角料裡的某個數更新了眾數。它在完整的塊中,最多也就出現 f
ff 次。所以能夠比 f
ff 多出來的也就是邊角料的內容。也就是 o(n
)\mathcal o(\sqrt)
o(n
) 嘛。
所以我們將每種數字的所有出現位置都放到乙個陣列裡,並記錄每個位置對應第幾次出現。設初值 t=f
t=ft=
f ,而後遍歷每個數字:如果它出現了至少 t+1
t+1t+
1 次——對應到陣列裡就是 app
ear[
id(x
)+t]
appear
[id(
x)+t
] 也在查詢區間內——那麼將 t+1
t+1t+
1 。複雜度也是正確的。
民意調查模組的BLL層
接著資料訪問層的再次重構,我們實現對應的bll層編碼,其實關於這部分的內容,可以參考bll層編碼實現,這裡僅僅簡單通過 而演示。構建民意調查模組的業務域物件 poll和polloption 上圖的 實際上只需從簡單實體類polldetail和polloptiondetail類中複製過來,改一下類名稱...
袁崇煥被凌遲處死悲劇背後的民心 民意
袁崇煥被凌遲處死悲劇背後的民心 民意zz 發信站 bbs 未名空間站 sat nov 26 17 03 28 2005 轉信 送交者 bread 主題 袁崇煥被凌遲處死悲劇背後的民心 民意!史海鉤沉 最初知道袁崇煥的經歷,是早先讀金庸 的後記裡一篇評傳,那時 印像不深,金庸的評傳寫得很好,只是我看的...
鏈路層的可靠交付和TCP可靠交付的區別
為了方便,我們將主機和路由器和交換機均稱為節點,我們將沿著通訊路徑連線相鄰節點的通訊通道稱為鏈路,為了將乙個資料報,從源主機傳輸到目的主機 端到端的傳輸 資料報必須通過沿著端到端路徑上的每一條鏈路,在通過特定的鏈路時,傳輸節點將次資料報封裝在鏈路層幀中,並將此幀傳送到鏈路上,接受節點接受該幀然後提取...