题意

在线区间众数

思路

预处理出 f[i][j] 即从第 i 块到第 j 块的答案。
对于每个询问,中间的整块直接用预处理出的,两端的 sqrtn 级别的数暴力做,用二分查找它们出现的次数。
每次询问的复杂度是 sqrtn * logn 。

 #include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N=;
vector<int> vec[N];
int n,m,a[N],b[N],block[N],ans,Block,L[N],R[N],cnt[N],top,stack[N],f[][],ff[][],tot;
int find1(int x,int y){
int l=;int r=vec[x].size()-;
int tmp=-;
while(l<=r){
int mid=(l+r)>>;
if(vec[x][mid]<=y){
tmp=mid;
l=mid+;
}
else r=mid-;
}
return tmp;
}
int find2(int x,int y){
int l=;int r=vec[x].size()-;
int tmp=;
while(l<=r){
int mid=(l+r)>>;
if(vec[x][mid]>=y){
tmp=mid;
r=mid-;
}
else l=mid+;
}
return tmp;
}
int main(){
scanf("%d%d",&n,&m);
Block=sqrt(n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+,b++n);
int num=unique(b+,b++n)-b-;
for(int i=;i<=n;i++){
a[i]=lower_bound(b+,b++num,a[i])-b;
block[i]=(i-)/Block+;
vec[a[i]].push_back(i);
if(!L[block[i]])L[block[i]]=i;
R[block[i]]=i;
}
for(int i=;i<=block[n];i++){
tot=;
for(int j=L[i];j<=n;j++){
cnt[a[j]]++;
if(tot<=cnt[a[j]]){
if(cnt[a[j]]>tot)ans=b[a[j]];
else ans=min(ans,b[a[j]]);
tot=cnt[a[j]];
}
f[i][block[j]]=tot;
ff[i][block[j]]=ans;
}
for(int j=L[i];j<=n;j++){
cnt[a[j]]=;
}
}
ans=;
for(int i=;i<=m;i++){
int l,r;
scanf("%d%d",&l,&r);
l=(l+ans-)%n+;r=(r+ans-)%n+;
if(l>r)swap(l,r);
if(block[l]+>=block[r]){
tot=;
ans=;
for(int i=l;i<=r;i++){
cnt[a[i]]++;
if(tot<=cnt[a[i]]){
if(cnt[a[i]]>tot)ans=b[a[i]];
else ans=min(ans,b[a[i]]);
tot=cnt[a[i]];
}
}
for(int i=l;i<=r;i++){
cnt[a[i]]=;
}
}
else{
top=;
tot=f[block[l]+][block[r]-];
ans=ff[block[l]+][block[r]-];
for(int i=l;i<=R[block[l]];i++){
cnt[a[i]]++;
if(cnt[a[i]]==)stack[++top]=a[i];
}
for(int i=L[block[r]];i<=r;i++){
cnt[a[i]]++;
if(cnt[a[i]]==)stack[++top]=a[i];
}
while(top){
int z=stack[top--];
int tmp=max(,find1(z,L[block[r]]-)-find2(z,R[block[l]]+)+);
if(tot<=cnt[z]+tmp){
if(cnt[z]+tmp>tot)ans=b[z];
else ans=min(ans,b[z]);
tot=cnt[z]+tmp;
}
cnt[z]=;
}
}
printf("%d\n",ans);
}
return ;
}

BZOJ 2724 [Violet 6]蒲公英(分块)的更多相关文章

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

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

  2. BZOJ 2724: [Violet 6]蒲公英 [分块 区间众数]

    传送门 题面太美不忍不放 分块分块 这种题的一个特点是只有查询,通常需要预处理:加入修改的话需要暴力重构预处理 预处理$f[i][j]$为第i块到第j块的众数,显然$f[i][j]=max{f[i][ ...

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

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

  4. [BZOJ 2724] [Violet 6] 蒲公英 【分块】

    题目链接:BZOJ - 2724 题目分析 这道题和 BZOJ-2821 作诗 那道题几乎是一样的,就是直接分块,每块大小 sqrt(n) ,然后将数字按照数值为第一关键字,位置为第二关键字排序,方便 ...

  5. BZOJ.2724.[Violet 6]蒲公英(静态分块)

    题目链接 区间众数 强制在线 考虑什么样的数会成为众数 如果一个区间S1的众数为x,那么S1与新区间S2的并的众数只会是x或S2中的数 所以我们可以分块先预处理f[i][j]表示第i到第j块的众数 对 ...

  6. 【刷题】BZOJ 2724 [Violet 6]蒲公英

    Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 Output Sample Input ...

  7. 【BZOJ 2724】 2724: [Violet 6]蒲公英 (区间众数不带修改版本)

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1908  Solved: 678 Description In ...

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

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 2900  Solved: 1031[Submit][Statu ...

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

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

随机推荐

  1. HD-ACM算法专攻系列(6)——Big Number

    题目描述: 源码: #include"iostream" #include"cmath" using namespace std; #define PI 3.1 ...

  2. 05:Cave Cows 1 洞穴里的牛之一

    总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  262144kB 描述 很少人知道其实奶牛非常喜欢到洞穴里面去探险.     洞窟里有N(1≤N≤100)个洞室,由 ...

  3. hiho 171周 - 水题,并查集

    题目链接 题目描述: 输入4 alice 2 alice@hihocoder.com alice@gmail.com bob 1 bob@qq.com alicebest 2 alice@gmail. ...

  4. Caffe学习--Net分析

    Caffe_Net 1.基本数据 vector<shared_ptr<Layer<Dtype> > > layers_; // 记录每一层的layer参数 vect ...

  5. 优动漫PAINT-牵牛花画法教程

    喇叭型对画者自身的塑形功力会有较高的要求,作者很靠谱的把他的塑形方式详细呈现了出来~ 对于这样的一个仿真效果的牵牛花完全可以使用优动漫PAINT完成,简单又快捷,软件下载:http://www.don ...

  6. seq去除重复数据

    DELETE FROM temp_fjh_2 a WHERE a.rowid!=(SELECT MAX(b.rowid) FROM temp_fjh_2 b WHERE a.a=b.a); 表名和列名 ...

  7. Angualr+asp.net core webapi+efcore系列

    想着学习一门前端框架,WTF,看了又看,卧槽对于.Net程序员来说,还有什么比面向对象更香的呢,所以果断的选择了Angular.正好看各路大神以及官方文档想学习一下asp.net core,那就搞起吧 ...

  8. day02变量

    一. 什么是变量? 变量:在程序运行过程中,值会发生变化的量.(与之相对应的,常量就是在程序运行过程中,值不会发生变化的量).无论是变量还是常量,在创建时都会在内存中开辟一块空间,用于保存它的值. 二 ...

  9. 玩转HTML5移动页面(动效篇)

    为一名前端,在拿到设计稿时你有两种选择: 快速输出静态页面 加上高级大气上档次狂拽炫酷屌炸天的动画让页面动起来 作为一个有志向的前端,当然是选2啦!可是需求时间又很短很短,怎么办呢? 这次就来谈谈一些 ...

  10. ORACLE查询优化之is null和is not null优化

    最近工作的时候遇到了比较大的数据查询,自己的sql在数据量小的时候没问题,在数据量达到300W的时候特别慢,只有自己优化sql了,以前没有优化过,所以记录下来自己的优化过程,本次是关于is null和 ...