采用一个二维数组
c
n
t
[
2
]
[
m
a
x
n
]
cnt[2][maxn]
cnt[2][maxn],其中第一个维度只有两个值:维度
"
0
"
"0"
"0"统计元素的当前频率;维度
"
1
"
"1"
"1"统计频率为
f
f
f的元素个数。(复杂度为
O
(
n
)
O(n)
O(n))
代码如下:
int mi=INF,mx=0,cnt[2][maxn];
//cnt[0][x]:表示元素 x 的当前频率。
//cnt[1][f]:表示频率为 f 的元素个数。
void add(int cl)
{
cnt[1][cnt[0][cl]]--;
cnt[0][cl]++;
cnt[1][cnt[0][cl]]++;
if(cnt[0][cl]<mi)mi=cnt[0][cl];
if(cnt[0][cl]>mx)mx=cnt[0][cl];
if(!cnt[1][cnt[0][cl]-1])mi++;
}
void del(int cl)
{
cnt[1][cnt[0][cl]]--;
cnt[0][cl]--;
cnt[1][cnt[0][cl]]++;
if(cnt[0][cl]<mi&&cnt[0][cl])mi=cnt[0][cl];
if(cnt[0][cl]>mx)mx=cnt[0][cl];
if(!cnt[1][cnt[0][cl]+1])mx--;
}