题解 P7252 [JSOI2011] 棒棒糖
题意
经典题,区间严格过半众数。若不存在则输出
sol
俺来介绍一些早已普及的高科技。
随机化一边去啦
一个非常规的巧妙做法
拆位,对于每一位组成的
对于答案的每一位的状态,就是这一位对应的 01 序列的 [l,r] 区间中状态数较多的那个。
实现细节:拆位的时候,逐位分开处理,可以做到
做完了。。吗?
并没有!当区间中不存在严格众数时会出错。
所以我们需要一个 check 来验证求出来的答案是否正确。。换句话说就是求区间中某数出现次数。
莫队二次离线大家都学过吧?那你应该会那个离线扫描线
没学过也没有关系。我们将求
从小到大扫描。另外维护一个数组
这样扫到 太神奇了!
这个算法就完整了。可惜是离线的。下文会介绍另外一种 check 方法。
https://www.luogu.com.cn/paste/2jpfpq4j
正道
前置知识:摩尔投票法。
简介一下,考虑增量求出一个数组中的严格众数。维护当前严格众数
他是正确的因为即使严格众数和其他数都抵消了也不会影响。
应该可以看出他是一个半群信息。。通俗来讲就是一般线段树可以维护的东西。
所以你把他丢到线段树上就好了。(我用的 zkw)
同样要 check。
https://www.luogu.com.cn/paste/9hoisbd3
真·高科技
嗯既然是半群信息,学术界有
但这个特殊问题有严格
看这里 https://zhuanlan.zhihu.com/p/79423299 这里面有另外一种高论 check
sto hqztrue orz