蒲公英/分块入门九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】蒲公英的更多相关文章

  1. [BZOJ2724][Violet 6]蒲公英

    [BZOJ2724][Violet 6]蒲公英 试题描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 输入示 ...

  2. BZOJ2724 [Violet 6]蒲公英 分块

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2724.html 题目传送门 - BZOJ2724 题意 求区间最小众数,强制在线. $n$ 个数,$m ...

  3. bzoj2724: [Violet 6]蒲公英(离散化+分块)

    我好弱啊..这题调了2天QwQ 题目大意:给定一个长度为n(n<=40000)的序列,m(m<=50000)次询问l~r之间出现次数最多的数.(区间众数) 这题如果用主席树就可以不用处理一 ...

  4. bzoj2724: [Violet 6]蒲公英 分块 区间众数 论algorithm与vector的正确打开方式

    这个,要处理各个数的话得先离散,我用的桶. 我们先把每个块里的和每个块区间的众数找出来,那么在查询的时候,可能成为[l,r]区间的众数的数只有中间区间的众数和两边的数. 证明:若不是这里的数连区间的众 ...

  5. 【分块】bzoj2724 [Violet 6]蒲公英

    分块,离散化,预处理出: ①前i块中x出现的次数(差分): ②第i块到第j块中的众数是谁,出现了多少次. 询问的时候,对于整块的部分直接获得答案:对于零散的部分,暴力统计每个数出现的次数,加上差分的结 ...

  6. bzoj2724: [Violet 6]蒲公英(分块)

    传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有.然而今天做了这道分块的题才发现分块的暴力之美(如果我空间 ...

  7. 【BZOJ2724】[Violet 6]蒲公英 分块+二分

    [BZOJ2724][Violet 6]蒲公英 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n ...

  8. BZOJ 2724: [Violet 6]蒲公英

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1633  Solved: 563[Submit][Status ...

  9. BZOJ 2724: [Violet 6]蒲公英( 分块 )

    虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...

  10. BZOJ_2724_[Violet 6]蒲公英_分块

    BZOJ_2724_[Violet 6]蒲公英_分块 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod ...

随机推荐

  1. jQuery显示隐藏

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. oracle数据库数值类型

    ---恢复内容开始--- 内容摘自网络 Oracle的数值类型有int,number,float,decimal,numberic等. NUMBER类型   定义   定义格式NUMBER (prec ...

  3. C#-----创建DataTable对象

    //DataTable表示内存中数据的一个表 DataTable dt = new DataTable(); /** * public DataColumn Add(string columnName ...

  4. Java基础(basis)-----异常与错误处理

    1.编译型异常和运行时异常       编译时异常是指程序正确 而由外界条件不满足而产生的异常 java 中要求必须去捕捉住这类异常 不然无法通过编译 运行时异常是指程序存在着bug 如空指针异常 数 ...

  5. 2.scrapy安装

    A.Anaconda如果已安装,那么可以通过 conda 命令安装 Scrapy,安装命令如下: conda install Scrapy   ============================ ...

  6. 如何用新安装的jdk替换掉Linux系统默认jdk

    版主写的非常棒: http://blog.csdn.net/u011364306/article/details/48375653

  7. sql server 中后缀为.mdf的文件是干什么用的??

    在微软的SQL Server 2000 数据库有三种类型的文件: 1)主要数据文件(扩展名.mdf是 primary data file 的缩写) 主要数据文件包含数据库的启动信息,并指向数据库中的其 ...

  8. java设计模式之动态代理的概述和实现

    概述 1.代理:本来应该自己做的事情,请了别人来做,被请的人就是代理对象. 举例:春节回家买票让人代买 2.在Java中java.lang.reflect包下提供了一个Proxy类和一个Invocat ...

  9. window下nodejs用nodemon启动koa2项目(用cmd启动不了,要用Git Bash Here 启动才可以)

    window下nodejs用nodemon启动koa2项目(用cmd启动不了,要用Git Bash Here 启动才可以)nodemon --watch 'app/**/*' -e ts --exec ...

  10. bzoj1606

    题目链接 反着循环就是每个东西只能选一次 #include<iostream> #include<cstdio> #include<cstdlib> #includ ...