• 【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],随时改变就是了。

    至于代码,我代码跟上面的思路不太一样......(逃,留坑

    G102的孤儿们都要好好的啊。
  • 相关阅读:
    Elasticsearch Transport 模块创建及启动分析
    ElasticSearch中的JVM性能调优
    ElasticSearch 线程池类型分析之 ResizableBlockingQueue
    ElasticSearch 线程池类型分析之 ExecutorScalingQueue
    ElasticSearch 线程池类型分析之SizeBlockingQueue
    Redis的LRU算法
    hdu 1828 Picture(线段树扫描线矩形周长并)
    sublime text2 插件
    Python学习笔记(十四):模块高级
    梦想启航
  • 原文地址:https://www.cnblogs.com/ve-2021/p/9804936.html
Copyright © 2020-2023  润新知