BZOJ 2724 [Violet 6]蒲公英(分块)
题意
在线区间众数
思路
预处理出 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]蒲公英(分块)的更多相关文章
- BZOJ 2724: [Violet 6]蒲公英( 分块 )
虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...
- BZOJ 2724: [Violet 6]蒲公英 [分块 区间众数]
传送门 题面太美不忍不放 分块分块 这种题的一个特点是只有查询,通常需要预处理:加入修改的话需要暴力重构预处理 预处理$f[i][j]$为第i块到第j块的众数,显然$f[i][j]=max{f[i][ ...
- BZOJ 2724: [Violet 6]蒲公英
2724: [Violet 6]蒲公英 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1633 Solved: 563[Submit][Status ...
- [BZOJ 2724] [Violet 6] 蒲公英 【分块】
题目链接:BZOJ - 2724 题目分析 这道题和 BZOJ-2821 作诗 那道题几乎是一样的,就是直接分块,每块大小 sqrt(n) ,然后将数字按照数值为第一关键字,位置为第二关键字排序,方便 ...
- BZOJ.2724.[Violet 6]蒲公英(静态分块)
题目链接 区间众数 强制在线 考虑什么样的数会成为众数 如果一个区间S1的众数为x,那么S1与新区间S2的并的众数只会是x或S2中的数 所以我们可以分块先预处理f[i][j]表示第i到第j块的众数 对 ...
- 【刷题】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 ...
- 【BZOJ 2724】 2724: [Violet 6]蒲公英 (区间众数不带修改版本)
2724: [Violet 6]蒲公英 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1908 Solved: 678 Description In ...
- 【BZOJ】2724: [Violet 6]蒲公英
2724: [Violet 6]蒲公英 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 2900 Solved: 1031[Submit][Statu ...
- 【BZOJ2724】[Violet 6]蒲公英 分块+二分
[BZOJ2724][Violet 6]蒲公英 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n ...
随机推荐
- POJ 2190 模拟
按照题意模拟就好- 注意"X"只能出现在最后一位... // by SiriusRen #include <cstdio> using namespace std; c ...
- winform控件命名规范对照表
WinForm Control 命名规范 数据类型 数据类型简写 标准命名举例 Label lbl lblMessage LinkLabel llbl llblToday Button btn btn ...
- SpringBoot(五) 番外---Docker
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...
- 蛋白质GO信息的一些数据库
最近用到蛋白质序列数据,但是才发现蛋白质的编号主要分为两种:一种是ENSP开头,主要是在ensembl数据库查询asia.ensembl.org/Human/Search:而另一种是uniprot.w ...
- 51nod 1098 最小方差 排序+前缀和+期望方差公式
题目: 题目要我们,在m个数中,选取n个数,求出这n个数的方差,求方差的最小值. 1.我们知道,方差是描述稳定程度的,所以肯定是着n个数越密集,方差越小. 所以我们给这m个数排个序,从连续的n个数中找 ...
- Linux下查看mysql错误日志
1.进入 mysql 安装目录 进入 data 目录(该目录存储的是数据库的数据) cd /usr/local/mysql ll 进入 mysql 目录 ,发现 文件后缀 .err,即是mysql ...
- 使用Java开发高性能网站需要关注的那些事儿2
近期各家IT媒体举办的业内技术大会让很多网站都在披露自己的技术内幕与同行们分享,大到facebook,百度,小到刚起步的网站.facebook,百度之类的大型网站采用的技术和超凡的处理能力的确给人 ...
- Html表单提交到Servlet输出到页面乱码
Html使用的编码是UTF-8编码显示页面,之后使用form表单提交字段到Servlet中,Servlet将利用getParamer方法获得form提交的字段,之后通过Respone中的writer将 ...
- (转)Java 虚拟机体系结构
来源:http://hxraid.iteye.com/blog/676235 众所周知,Java源代码被编译器编译成class文件.而并不是底层操作系统可以直接执行的二进制指令(比如Windows O ...
- Python的那些坑--------括号篇
在Python中遇见了带不带括号的问题,我目前的是这三种,有问题请指出.如果有其他的,我后续会更新 一 函数带不带括号: def a(x): return x print(a) #不带括号调用的结果 ...