【BZOJ2724】【Violet 6】蒲公英
蒲公英/分块入门九Byhzwer
辣鸡我复制粘贴题面格式极其丑陋,各位看原题面啦。
【题目描述】
在乡下的小路旁种着许多蒲公英,而我们的问题正是与这些蒲公英有关。
为了简化起见,我们把所有的蒲公英看成一个长度为n的序列 (a1,a2..an),其中 ai为一个正整数,表示第i棵蒲公英的种类编号。
而每次询问一个区间 [l,r],你需要回答区间里出现次数最多的是哪种蒲公英,如果有若干种蒲公英出现次数相同,则输出种类编号最小的那个。
注意,你的算法必须是在线的
【输入格式】
第一行两个整数 n,m,表示有n株蒲公英,m次询问。
接下来一行n个空格分隔的整数 a_i ,表示蒲公英的种类
再接下来m 行每行两个整数 l0,r0,我们令上次询问的结果为 x(如果这是第一次询问, 则 x=0)。
令 l=(l0+x-1)mod n+1,r=(r0+x-1)mod n+1如果 l>r,则交换 l,r 。
最终的询问区间为[l,r]。
【输出格式】
输出m 行。每行一个整数,表示每次询问的结果。
【题解思路】
某谷上写的一道黑题
传送门:hzwer的分块入门+WJMZBMR的区间众数解题报告
没什么心思写难题,毕竟我还有很多坑要填,但是分块入门九题就差这一题了有点不甘心。
蒲公英是强制在线的,而wjmzbmr的解题报告中涉及了单点修改和区间众数查询,同样也需要在线完成。
区间众数解题报告
考虑单独询问众数的操作
如果一个元素既不是集合a的众数也不在集合b中,那么它在a,b集合所有元素中出现的次数就是在a中出现的次数,不会比单独在集合a中出现的次数要多。
我们可以预处理出从块i到块j这些数的众数,然后按照分块的一般套路来写,只需枚举这些数并判断出现次数,块中优化可用二分。
考虑优化
我们需要在O(1)时间内回答[l,r]中有几个x这样的问题,我们很自然的想到了类似前缀和的优化。设f[i][x]表示[0,i]区间内有多少个x然后对于区间[l,r]内x的个数,只需f[r,x] – f[l-1,x]。考虑如何优秀地预处理出f[i][x],那当然是分块。
同时对于每一个块b,预处理出A[b][i][x]:块b的前i个元素中x出现了多少次。可以通过每个块开一个表(什么表啊)来实现。
我真的没太懂开表实现blalala。
阔是,我萌还要搞一些操作,把这过东西搞成在线的。
考虑在线修改
对于每个块,不管怎么搞,我们需要维护每个值在其中出现了多少次和最大出现次数,同时用cnt[i]表示出现了i次的值有几个。
具体维护灰常容易,就那么暴力搞就行了。关于f[i][x],随时改变就是了。
至于代码,我代码跟上面的思路不太一样......(逃,留坑
【BZOJ2724】【Violet 6】蒲公英的更多相关文章
- [BZOJ2724][Violet 6]蒲公英
[BZOJ2724][Violet 6]蒲公英 试题描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 输入示 ...
- BZOJ2724 [Violet 6]蒲公英 分块
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2724.html 题目传送门 - BZOJ2724 题意 求区间最小众数,强制在线. $n$ 个数,$m ...
- bzoj2724: [Violet 6]蒲公英(离散化+分块)
我好弱啊..这题调了2天QwQ 题目大意:给定一个长度为n(n<=40000)的序列,m(m<=50000)次询问l~r之间出现次数最多的数.(区间众数) 这题如果用主席树就可以不用处理一 ...
- bzoj2724: [Violet 6]蒲公英 分块 区间众数 论algorithm与vector的正确打开方式
这个,要处理各个数的话得先离散,我用的桶. 我们先把每个块里的和每个块区间的众数找出来,那么在查询的时候,可能成为[l,r]区间的众数的数只有中间区间的众数和两边的数. 证明:若不是这里的数连区间的众 ...
- 【分块】bzoj2724 [Violet 6]蒲公英
分块,离散化,预处理出: ①前i块中x出现的次数(差分): ②第i块到第j块中的众数是谁,出现了多少次. 询问的时候,对于整块的部分直接获得答案:对于零散的部分,暴力统计每个数出现的次数,加上差分的结 ...
- bzoj2724: [Violet 6]蒲公英(分块)
传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有.然而今天做了这道分块的题才发现分块的暴力之美(如果我空间 ...
- 【BZOJ2724】[Violet 6]蒲公英 分块+二分
[BZOJ2724][Violet 6]蒲公英 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n ...
- BZOJ 2724: [Violet 6]蒲公英
2724: [Violet 6]蒲公英 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1633 Solved: 563[Submit][Status ...
- BZOJ 2724: [Violet 6]蒲公英( 分块 )
虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...
- BZOJ_2724_[Violet 6]蒲公英_分块
BZOJ_2724_[Violet 6]蒲公英_分块 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod ...
随机推荐
- sublime text3 增加代码片段(snipper)
有时候编写代码时有些代码片段经常会用到,如果能将这些代码片段整理,再在需要的时候通过某些条件触发,那无疑是非常方便的! 创建方法:工具->插件开发->新建代码片段 默认产生的内容是: &l ...
- html5-新布局元素header,footer
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- Keras中使用LSTM层时设置的units参数是什么
https://www.zhihu.com/question/64470274 http://colah.github.io/posts/2015-08-Understanding-LSTMs/ ht ...
- hdu1569 莫比乌斯反演
hdu 1695 莫比乌斯反演 给出a,b,c,d,k, 求满足a <= x <= b && c <= y <= d && gcd(x,y)=k ...
- OpenCV学习笔记(一) - 边界填充、Rect函数
边界填充: c++实现,测试在mac pro里,输入720p时间0.4ms: cv::copyMakeBorder(image, dst, , , , , cv::BORDER_REPLICATE); ...
- python range函数
这个函数很简单,就不写例子了,看看语法,拿来即用 python range() 函数可创建一个整数列表,一般用在 for 循环中. 函数语法 range(start, stop[, step]) 参数 ...
- numpy文件操作
import numpy as np print '读取csv文件做为数组' arr = np.loadtxt('array_ex.txt', delimiter = ',') print arr i ...
- SQL数据分析概览——Hive、Impala、Spark SQL、Drill、HAWQ 以及Presto+druid
转自infoQ! 根据 O’Reilly 2016年数据科学薪资调查显示,SQL 是数据科学领域使用最广泛的语言.大部分项目都需要一些SQL 操作,甚至有一些只需要SQL. 本文涵盖了6个开源领导者: ...
- Windows 7关闭睡眠(休眠)模式和删除休眠文件
原文地址:https://www.192ly.com/pc/win7/gb-sm.html 怎么关闭Windows 7关闭睡眠(休眠)功能?Windows 7系统中怎么删除休眠文件?Windows 7 ...
- vue中组件通信之父子通信:props(组件传参)
实例一: <div id="app"> <alert msg="hhhhhhh"></alert> </div> ...