萌新求助分块蒲公英 10pts WA

P4168 [Violet] 蒲公英

Micnation_AFO @ 2022-09-04 00:47:18

思路:先离散化到 b 里面,然后 fir_i 表示 b 数组中值为 i 的数字原来的值是多少。

`get_time` 求的是 $[l, r]$ 中 $x$ 出现的次数。 $num_i$ 表示第 $i$ 个块中出现次数最多的元素**的次数**,$ID_i$ 表示第 $i$ 块中出现次数最多的元素中最小的元素**的值**。 `bf` 用来求出,$[l, r]$ 中的每个元素在 $[L, R]$ 中出现的次数的最大值,并返回最大值出现的次数和数值。(若有多个次数相等,则取数值小的) ``` pii A = bf(l, R[p], l, r), B = bf(L[q], r, l, r); ``` 是对左右两端散的块进行处理。 ```cpp for (int i = p + 1; i <= q - 1; i++) { int x = get_times(ID[i], l, r); if (x > val || (x == val && (id == INF || id > ID[i]))) val = x, id = ID[i]; } ``` 是在整块中找到次数最多的值(若次数同样多取最小值)。 最后返回左右两边以及整块中出现的次数的最大值的元素的值。 但是,我在 `make_pair` 的时候都选择了把第二个值(即最多次数的元素值)乘上 $-1$,这是因为题目要求若次数相同返回值最小的。最后返回答案的时候再乘上 $-1$。 拍了 $\texttt{2000}$ 组的数据,但是一组比较小的数据都没拍出来,只有 $10\texttt{pts}$/kk。 代码:[Link](https://www.luogu.com.cn/paste/5zlhad3m)。

by Micnation_AFO @ 2022-09-12 13:34:18

找到了一个 bug,代码已经 upd


by Micnation_AFO @ 2022-09-12 13:48:54

AC 了,原因就是上面的 bug


|