蒲公英
求最小眾數
蒲公英掉紫了?
黑色經驗-1
n ≤4
e4,a
i≤1e
9n\le 4e4,a_i\le 1e9
n≤4e4,
ai≤
1e9,離散化
竟然不帶修,多美好的世界
預處理si,
js_
si,j
表示第i
ii塊中j
jj的出現次數
p i,
jp_
pi,j
表示第i
ii塊到第j
jj塊的眾數
那麼[ l,
r]
[l,r]
[l,r
]的眾數為整塊眾數和散裝中數的並集,統計這些數個數即可
用桶統計,pot
[i]≤
2n+1
pot[i]\le 2\sqrt n+1
pot[i]
≤2n
+1整塊類字首和,o(1
)o(1)
o(1)
;總查詢o(n
)o(\sqrt n)
o(n)
預處理:
s i,
js_
si,j
字首和
p i,
jp_
pi,j
,列舉i,j
i,ji,
j,利用si,
js_
si,j更新
#include
using
namespace std;
#define in read()
int in
#define pb push_back
const
int n=
1e5+
5,m=
1e3+
5,inf=
2147483647
;int n,sz,lim,m;
int bl[n]
,a[n]
,val[n]
;int s[m]
[n],p[m]
[m];
int pot[n]
;vector<
int>inpot;
void
discretize()
return;}
void
prepare()
if(cnt==s[j]
[val[k]
]-s[i-1]
[val[k]
]&&mode>val[k]
) mode=val[k];}
if(i!=j)
if(cnt==s[j]
[k]-s[i-1]
[k]&&mode>k)
mode=k;
} p[i]
[j]=mode;
}return;}
intquery
(int l,
int r)
int mode=inf,cnt=0;
if(bl[l]
==bl[r])if
(pot[val[i]
]==cnt&&mode>val[i]
) mode=val[i]
; inpot.
pb(val[i]);
}return mode;
}else
if(pot[val[i]
]==cnt&&mode>val[i]
) mode=val[i]
; inpot.
pb(val[i]);
}for
(int i=r;bl[i]
==bl[r]
;--i)
if(pot[val[i]
]==cnt&&mode>val[i]
) mode=val[i]
; inpot.
pb(val[i]);
}if(bl[r]
==bl[l]+1
)return mode;
int mone=p[bl[l]+1
][bl[r]-1
];if(pot[mone]
)return mode;
pot[mone]
+=s[bl[r]-1
][mone]
-s[bl[l]
][mone];if
(pot[mone]
>cnt)
if(pot[mone]
==cnt&&monemode=mone;
inpot.
pb(mone)
;return mode;}}
intmain()
return0;
}
蒲公英 分塊
在鄉下的小路旁種著許多蒲公英,而我們的問題正是與這些蒲公英有關。為了簡化起見,我們把所有的蒲公英看成乙個長度為 n 的序列a1,a2,an,其中ai為乙個正整數,表示第 i 棵蒲公英的種類編號。而每次詢問乙個區間 l,r 你需要回答區間裡出現次數最多的是哪種蒲公英,如果有若干種蒲公英出現次數相同,則...
分塊 蒲公英
include include include include define maxn 40005 using namespace std int rd return x partition section int a maxn blk maxn sizb int tmplwb maxn 離散化的輔...
Violet 蒲公英 分塊
題解 講道理,關於區間眾數問題應該第乙個就想到分塊,可毒瘤出題人說是線段樹.qaq 考慮查詢的區間 l,r 第一種情況,我們可以考字首和以及遞推來進行預處理,查詢的時候直接呼叫即可。第二種情況,我們開乙個桶,將 2 個端點所在不完整塊進行統計,再用乙個 vector 加上中間完整整塊對這些顏色的貢獻...