可靠的民意

2021-10-19 11:25:29 字數 2916 閱讀 4534

真正的題目 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

ic

eadvice

advice

:充分地考慮一下分塊的作用,然後接著往下看。說實話,我自己都沒想明白。

用 f(l

,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可靠交付的區別

為了方便,我們將主機和路由器和交換機均稱為節點,我們將沿著通訊路徑連線相鄰節點的通訊通道稱為鏈路,為了將乙個資料報,從源主機傳輸到目的主機 端到端的傳輸 資料報必須通過沿著端到端路徑上的每一條鏈路,在通過特定的鏈路時,傳輸節點將次資料報封裝在鏈路層幀中,並將此幀傳送到鏈路上,接受節點接受該幀然後提取...