Description

  原题的时间限制是 2s .

亲爱的哥哥:
  你在那个城市里面过得好吗?
  我在家里面最近很开心呢。昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了。我觉得把那么可怕的怪物召唤出来的那个坏蛋也很坏呢。不过奶奶说他是很难受的时候才做出这样的事的……
  最近村子里长出了一大片一大片的蒲公英。一刮风,这些蒲公英就能飘到好远的地方了呢。我觉得要是它们能飘到那个城市里面,让哥哥看看就好了呢!
  哥哥你要快点回来哦!

爱你的妹妹 Violet

  Azure 读完这封信之后微笑了一下。
  “蒲公英吗……”
  
  
  在乡下的小路旁种着许多蒲公英,而我们的问题正是与这些蒲公英有关。
  为了简化起见,我们把所有的蒲公英看成一个长度为 n 的序列 (a1, a2, a3, ..., an),其中 ai 为一个正整数,表示第 i 棵蒲公英的种类编号。
  而每次询问一个区间[lr],你需要回答区间里出现次数最多的是哪种蒲公英,如果有若干种蒲公英出现次数相同,则输出种类编号最小的那个。
  注意,你的算法必须是在线的。

Input

  第一行两个整数 nm,表示有 n 株蒲公英,m 次询问。
  接下来一行 n 个空格分隔的整数 ai,表示蒲公英的种类。
  再接下来 m 行每行两个整数 l0, r0,我们令上次询问的结果为 x(如果这是第一次询问,则 x = 0)。
  令 l = (l0 + x - 1) mod n + 1, r = (r0 + x - 1) mod n + 1,如果 l > r,则交换 lr
  最终的询问区间为[lr]。

Output

  输出 m 行。每行一个整数,表示每次询问的结果。

Sample Input

6 3
1 2 3 2 1 2
1 5
3 6
1 5

Sample Output

1
2
1

Hint

  对于 20% 的数据,保证 1 ≤ nm ≤ 3000 。
  对于 100% 的数据,保证 1 ≤ n ≤ 40000,1 ≤ m ≤ 50000,1 ≤ ai ≤ 109 。

Source

Violet 6 最终话

区间求众数,强制在线。

分块处理,求出每一块区间的众数。对于一次询问的区间,其中众数要么是中间大块的众数,要么是两边小块中的数。

扫描所求区间中的边缘小块,求其中每个数在区间内的出现次数,找出次数最多的就是区间众数了。

求数的出现次数,可以预先用vector或者普通数组存这个数在序列中的每一个出现位置,然后二分查找即可。

不管什么算法,逢二分必挂的被动技能又强行发动了,调二分调了半小时……

用时比别人多了10000+ms,也是迷。

 /*by SilverN*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
const int mxn=;
const int block=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m;
//
vector<int>pos[mxn];//数字出现位置
int v[mxn];//离散化标号对应的数字
map<int,int>mp;int mct=;//数字对应的离散化标号
//
int f[][];
int b[mxn];//分块
//
int a[mxn];
int cnt[mxn];
void init(int x){
memset(cnt,,sizeof cnt);
int i,j;
int mx=,num=;
for(i=(x-)*block+;i<=n;i++){
cnt[v[i]]++;
if(cnt[v[i]]>mx || (cnt[v[i]]==mx && a[i]<num)){
mx=cnt[v[i]];
num=a[i];
}
f[x][b[i]]=num;
}
return;
}
int find(int x,int L,int R){
/* x=mp[x];
int t=upper_bound(pos[x].begin(),pos[x].end(),R)-lower_bound(pos[x].begin(),pos[x].end(),L);
return t;*/
x=mp[x];
int l=,r=pos[x].size()-;
int ansl,ansr;
while(l<=r){
int mid=(l+r)>>;
if(pos[x][mid]<=R)l=mid+;
else r=mid-;
}
ansr=l;
l=,r=pos[x].size()-;
while(l<=r){
int mid=(l+r)>>;
if(pos[x][mid]<L)l=mid+;
else r=mid-;
}
ansl=l;
// printf("ask:%d res:%d %d\n",x,ansl,ansr);
return ansr-ansl;
}
int query(int l,int r){
int mxnum=f[b[l]+][b[r]-];
int mx=find(mxnum,l,r);
int i,j;
int ed=min(b[l]*block,r);
for(i=l;i<=ed;i++){
int tmp=find(a[i],l,r);
if(tmp>mx || (tmp==mx && a[i]<mxnum)){
mx=tmp; mxnum=a[i];
}
}
if(b[l]!=b[r])
for(i=(b[r]-)*block+;i<=r;i++){
int tmp=find(a[i],l,r);
if(tmp>mx || (tmp==mx && a[i]<mxnum)){
mx=tmp; mxnum=a[i];
}
}
return mxnum;
}
int main(){
n=read();m=read();
int i,j;
for(i=;i<=n;i++){
a[i]=read();
if(!mp[a[i]])mp[a[i]]=++mct;
v[i]=mp[a[i]];
pos[v[i]].push_back(i);
}
for(i=;i<=n;++i){b[i]=(i-)/block+;}
for(i=;i<=b[n];i++){init(i);}
int x=;
int ql,qr;
while(m--){
ql=read();qr=read();
ql=(ql+x-)%n+;
qr=(qr+x-)%n+;
if(ql>qr)swap(ql,qr);
x=query(ql,qr);
printf("%d\n",x);
}
return ;
}

巴蜀3540 -- 【Violet 6 最终话】蒲公英的更多相关文章

  1. 【Fate/kaleid liner 魔法少女☆伊莉雅】系列中实践的、新世代的动画摄影工作流

          通常的日本动画的摄影中,是以追加Cell(celluloid 赛璐珞)与背景的合成滤镜处理为主,而在[Fate/kaleid liner 魔法少女☆伊莉雅]系列的,加入了自己使用3DCG软 ...

  2. Entity Framework Demo(一) 简单搭建环境

    Entity Framwork(实体框架,简称EF)是ORM(Object Relational Mapping,对象映射关系)的一个解决方案. EF允许项目将数据库的表映射为实体,并封装了操作方法, ...

  3. GDOI2021划水记

    Day0 上午有意志行,一大早就醒了,然后走了五个小时脚痛.中午洗澡,宿舍轮流看巨人最终话然后聊了一个小时? 下午老师带着我和全爷先开溜,宿舍好像很破旧还还没得充电,领了牌牌和斐爷去吃饭. 然后六点多 ...

  4. 洛谷 P4168 [Violet]蒲公英 解题报告

    P4168 [Violet]蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多 ...

  5. 【luogu1468】[Violet]蒲公英--求区间众数

    题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了.我觉得把那么可怕 ...

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

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

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

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

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

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

  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. poj3436 Computer Factory

    题意: 电脑公司生产电脑有N个机器,每个机器单位时间产量为Qi. 电脑由P个部件组成,每个机器工作时只能把有某些部件的半成品电脑(或什么都没有的空电脑)变成有另一些部件的半成品电脑或完整电脑(也可能移 ...

  2. CSS层叠的问题、标准文档流、伪类选择器

    一.层叠的问题 CSS有两个性质: 1.继承性 2.层叠性:选择器的一种选择能力,谁的权重大就选谁 层叠性又分为: 1).选不中:走继承性  (font.color.text.) 继承性的权重是0 若 ...

  3. JS内置对象练习(慕课网题目)

    效果图: XXXX年XX月X日 星期X--班级总分为:81 格式要求: 1.显示打印的日期. 格式为类似“XXXX年XX月XX日 星期X” 的当前的时间. 2.计算出该班级的平均分(保留整数). 同学 ...

  4. Eigen3的安装

  5. JS正则匹配待重命名文件名

    <script>var str = "123 - Copy(2).csv";var regExp = /^123( - Copy(\(\d+\))?)?.csv$/;d ...

  6. MyEclipse 2015 安装到配置一站式备忘

    目录 h1 2121 h1 2121

  7. 深入Docker 存储驱动 (转)

    参考: http://static.dockerone.com/ppt/filedriver.html#28

  8. Android(java)学习笔记171:服务(service)之绑定服务调用服务里面的方法

    1.绑定服务调用服务里面的方法,图解: 步骤: (1)在Activity代码里面绑定 bindService(),以bind的方式开启服务 :                     bindServ ...

  9. 关于JDBC访问存储过程的问题

    最近开发一个应用,需要调用一个入参为List的存储过程. 存储过程为: proc_test(p1 OUT Number, p2 IN Number, p3 IN TAB_CUSTOMER); 这个Li ...

  10. Unity c# 状态机的简单入门

    状态机模式在unity中作用是非常大的,可以实现角色的移动和场景的跳转,包括一些动画的播放,在很多unity框架中也是很常见的,发散思维广阔,下面是简单的状态机的实现,有注释 using System ...