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. git找不到远程库问题

    git报错:Couldn't find remote ref XXXX (gitlab报错)XXXX does not appear to be a git repository Could not ...

  2. 多路复用IO和异步IO

    多路复用I/O 它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程. 流程图如下: 当用户进程调用了sel ...

  3. HTTP协议 处理流程

    我们平时在浏览网页的时候都是使用浏览器,输入你要的网址后回车,就会显示出我们所想要的内容,看似这个简单的用户操作行为的背后,Web的工作原理是怎样的呢?到底隐藏了些什么呢? 对于传统的上网流程,系统它 ...

  4. mySQL ODBC 在windows 64位版上的驱动问题

    1,问题的起源 某次编辑一个asp文件,其中访问mysql数据库的连接字符串如下: "driver={mysql odbc 3.51 driver};server=localhost;uid ...

  5. 四次元新浪微博客户端Android源码

    四次元新浪微博客户端Android源码 源码下载:http://code.662p.com/list/11_1.html [/td][td] [/td][td] [/td][td] 详细说明:http ...

  6. leetcode_935. Knight Dialer_动态规划_矩阵快速幂

    https://leetcode.com/problems/knight-dialer/ 在如下图的拨号键盘上,初始在键盘中任意位置,按照国际象棋中骑士(中国象棋中马)的走法走N-1步,能拨出多少种不 ...

  7. Opencascade 选择器算法

    算法的阶段 该算法包括预处理和三个主要阶段. 使用深度优先搜索逐层遍历所有对象 . 预处理 计算平截头体及其主要特征的计算. 第一阶段 - 遍历第一级BVH树 在成功构建选择平截头体之后,算法开始遍历 ...

  8. 利用CWinThread实现跨线程父子MFC窗口

    利用CWinThread实现跨线程父子MFC窗口 MFC对象只能由创建该对象的线程访问,而不能由其他线程访问. 不遵守该准则将导致断言(assertion)或者无法预知的程序行为等运行期错误. 在多线 ...

  9. CPP-STL:随机数发生器random_shuffle

    //--------------------------------------------------------------------------- #include <string.h& ...

  10. JavaScript中通过原型添加方法,解决数据共享问题,节省内存空间

    涉及知识点:(1)原型的引入(2)构造函数.原型对象和实例对象之间的关系(3)__proto__和prototype的理解 直接举例:在自定义构造函数创建对象时,因为创建的对象使用的不是同一个方法,所 ...