题目链接

区间众数 强制在线

考虑什么样的数会成为众数

如果一个区间S1的众数为x,那么S1与新区间S2的并的众数只会是x或S2中的数

所以我们可以分块先预处理f[i][j]表示第i到第j块的众数

对于零散部分,我们还需要知道它们在区间中的出现次数。这部分至多有2sqrt(n)个

由于没有修改,离散化后对于每个数x开一个vector,把x出现位置push_back进去,查x时二分即可。

像普通分块一样更新即可。之前写了一堆特判 醉了

这个块大小怎么算。。没算出来。

//2520kb    19652ms 这么慢。。
#include <cmath>
#include <cctype>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#define gc() getchar()
const int N=4e4+5,S=205; int n,m,size,f[S][S],t[S][S],A[N],ref[N],bel[N],tm[N];
std::vector<int> v[N]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int Find(int x,int r)
{
int l=1,mid;
while(l<r)
if(ref[mid=l+r>>1]>=x) r=mid;
else l=mid+1;
return l;
}
void Discrete()
{
for(int i=1; i<=n; ++i) ref[i]=A[i]=read();
std::sort(ref+1,ref+1+n);
int cnt=1;
for(int i=2; i<=n; ++i)
if(ref[i]!=ref[i-1]) ref[++cnt]=ref[i];
for(int i=1; i<=n; ++i) A[i]=Find(A[i],cnt);
}
void Init()
{
Discrete();
for(int i=1; i<=n; ++i) bel[i]=(i-1)/size+1;
for(int i=1; i<=n; ++i) v[A[i]].push_back(i);
for(int i=1; i<=bel[n]; ++i)
{
memset(tm,0,sizeof tm);
int id=0,mxt=0;
for(int j=i; j<=bel[n]; ++j)
{
int r=std::min(size*j,n);
for(int k=(j-1)*size+1; k<=r; ++k)
if(++tm[A[k]]>mxt) id=A[k],mxt=tm[id];
else if(tm[A[k]]==mxt && A[k]<id) id=A[k];
f[i][j]=id, t[i][j]=mxt;
}
}
}
int Lower(int id,int x)
{
int l=0,r=v[id].size()-1,mid;
while(l<r)
if(v[id][mid=l+r>>1]>=x) r=mid;
else l=mid+1;
return l;
}
int Upper(int id,int x)
{
int l=0,r=v[id].size(),mid;
while(l+1<r)
{
if(v[id][mid=l+r>>1]<=x) l=mid;
else r=mid;
}
return l;
}
inline int Query(int l,int r,int id){
if(!id) return 0;
return Upper(id,r)-Lower(id,l)+1;
}
void Update(int l,int r,int L,int R,int &id,int &mxt)
{
for(int tmp,i=l; i<=r; ++i)
if((tmp=Query(L,R,A[i]))>mxt||(tmp==mxt&&id>A[i]))
id=A[i], mxt=tmp;
}
int Solve(int l,int r)
{
int id=f[bel[l]+1][bel[r]-1],mxt=t[bel[l]+1][bel[r]-1];//mxt=Query(l,r,id);//这样id可能不存在 为0,Query中必须要特判
Update(l,std::min(r,bel[l]*size),l,r,id,mxt);
if(bel[l]!=bel[r]) Update((bel[r]-1)*size+1,r,l,r,id,mxt);
return id;
} int main()
{
n=read(),m=read(); size=sqrt(n);//200
Init();
int res=0,l,r;
while(m--)
{
l=(read()+res-1)%n+1, r=(read()+res-1)%n+1;
if(l>r) std::swap(l,r);
printf("%d\n",res=ref[Solve(l,r)]);
}
return 0;
}

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

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

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

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

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

  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]蒲公英 [分块 区间众数]

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

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

    题意 在线区间众数 思路 预处理出 f[i][j] 即从第 i 块到第 j 块的答案.对于每个询问,中间的整块直接用预处理出的,两端的 sqrtn 级别的数暴力做,用二分查找它们出现的次数.每次询问的 ...

  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. 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. oracle 监听 添加ip

    同时修改tnsnames.ora.listener.ora将这两个文件中HOST后面的主机都修改为127.0.0.1然后重启OracleServiceXE.OracleXETNSListener服务 ...

  2. vue系列之核心思想

    1.数据驱动 只要改变数据,Vuejs会通过Directives指令对DOM进行封装,当数据发生变化,会通知相应的DOM进行变化 Vuejs会对DOM进行监听,通过DOMListeners监听视图的变 ...

  3. 中文多分类 BERT

    直接把自己的工作文档导入的,由于是在外企工作,所以都是英文写的 Steps: git clone https://github.com/google-research/bert prepare dat ...

  4. javaMelody监控javaWeb程序性能

    JavaMelody应用监控使用指南 原文:<JavaMelody应用监控使用指南> 前言 本文参考JavaMelody的UserGuide编写,部分文字均来自文档,添加有个人理解.并进行 ...

  5. 关于java中Stream理解

    关于java中Stream理解 Stream是什么 Stream:Java 8新增的接口,Stream可以认为是一个高级版本的Iterator.它代表着数据流,流中的数据元素的数量可以是有限的, 也可 ...

  6. notepad++颜色修改

    设置-->>语言格式设置-->> https://blog.csdn.net/onceing/article/details/51554399(别人博客园的内容) 另外下面是N ...

  7. ES6精简要点

    没想到ES7都出来了(虽然并不大),想到自己ES6还没学完 现在就补补吧,记录下重点部分 Let的用法 用来声明块级变量 f1();function f1() { let n = 5; if (tru ...

  8. P3763 [TJOI2017]DNA

    链接:https://www.luogu.org/problemnew/show/P3763 题解: 挺水的一题后缀数组 枚举每一个开头用后缀数组判断能否在3次内匹配完

  9. [转]oracle10客户端PL/SQL Developer如何连接远程服务器上的oracle数据库

    时间:2013年8月21日 前提条件:假设你已经安装好了oracle和PL/SQL Developer,知道远程服务器的IP和数据库端口,知道远程服务器上的oracle数据库名和密码 如何用PL/SQ ...

  10. routing路由模式

    一:介绍 1.模式 2.应用场景 如果exchangge与队列中的key相同,消息就发送过去. 这个就是需要将交换机与队列增加key. 3.路由类型 上节课的订阅模式中的路由类型是Fanout. 这篇 ...