巴蜀3540 -- 【Violet 6 最终话】蒲公英
Description
你在那个城市里面过得好吗?
我在家里面最近很开心呢。昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了。我觉得把那么可怕的怪物召唤出来的那个坏蛋也很坏呢。不过奶奶说他是很难受的时候才做出这样的事的……
最近村子里长出了一大片一大片的蒲公英。一刮风,这些蒲公英就能飘到好远的地方了呢。我觉得要是它们能飘到那个城市里面,让哥哥看看就好了呢!
哥哥你要快点回来哦!
Azure 读完这封信之后微笑了一下。
“蒲公英吗……”
在乡下的小路旁种着许多蒲公英,而我们的问题正是与这些蒲公英有关。
为了简化起见,我们把所有的蒲公英看成一个长度为 n 的序列 (a1, a2, a3, ..., an),其中 ai 为一个正整数,表示第 i 棵蒲公英的种类编号。
而每次询问一个区间[l, r],你需要回答区间里出现次数最多的是哪种蒲公英,如果有若干种蒲公英出现次数相同,则输出种类编号最小的那个。
注意,你的算法必须是在线的。
Input
接下来一行 n 个空格分隔的整数 ai,表示蒲公英的种类。
再接下来 m 行每行两个整数 l0, r0,我们令上次询问的结果为 x(如果这是第一次询问,则 x = 0)。
令 l = (l0 + x - 1) mod n + 1, r = (r0 + x - 1) mod n + 1,如果 l > r,则交换 l, r。
最终的询问区间为[l, r]。
Output
Sample Input
1 2 3 2 1 2
1 5
3 6
1 5
Sample Output
2
1
Hint
对于 100% 的数据,保证 1 ≤ n ≤ 40000,1 ≤ m ≤ 50000,1 ≤ ai ≤ 109 。
Source
区间求众数,强制在线。
分块处理,求出每一块区间的众数。对于一次询问的区间,其中众数要么是中间大块的众数,要么是两边小块中的数。
扫描所求区间中的边缘小块,求其中每个数在区间内的出现次数,找出次数最多的就是区间众数了。
求数的出现次数,可以预先用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 最终话】蒲公英的更多相关文章
- 【Fate/kaleid liner 魔法少女☆伊莉雅】系列中实践的、新世代的动画摄影工作流
通常的日本动画的摄影中,是以追加Cell(celluloid 赛璐珞)与背景的合成滤镜处理为主,而在[Fate/kaleid liner 魔法少女☆伊莉雅]系列的,加入了自己使用3DCG软 ...
- Entity Framework Demo(一) 简单搭建环境
Entity Framwork(实体框架,简称EF)是ORM(Object Relational Mapping,对象映射关系)的一个解决方案. EF允许项目将数据库的表映射为实体,并封装了操作方法, ...
- GDOI2021划水记
Day0 上午有意志行,一大早就醒了,然后走了五个小时脚痛.中午洗澡,宿舍轮流看巨人最终话然后聊了一个小时? 下午老师带着我和全爷先开溜,宿舍好像很破旧还还没得充电,领了牌牌和斐爷去吃饭. 然后六点多 ...
- 洛谷 P4168 [Violet]蒲公英 解题报告
P4168 [Violet]蒲公英 题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多 ...
- 【luogu1468】[Violet]蒲公英--求区间众数
题目背景 亲爱的哥哥: 你在那个城市里面过得好吗? 我在家里面最近很开心呢.昨天晚上奶奶给我讲了那个叫「绝望」的大坏蛋的故事的说!它把人们的房子和田地搞坏,还有好多小朋友也被它杀掉了.我觉得把那么可怕 ...
- BZOJ 2724: [Violet 6]蒲公英
2724: [Violet 6]蒲公英 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1633 Solved: 563[Submit][Status ...
- [BZOJ2724][Violet 6]蒲公英
[BZOJ2724][Violet 6]蒲公英 试题描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 输入示 ...
- BZOJ 2724: [Violet 6]蒲公英( 分块 )
虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...
- BZOJ_2724_[Violet 6]蒲公英_分块
BZOJ_2724_[Violet 6]蒲公英_分块 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod ...
随机推荐
- struct和union
struct的小秘密 C语言中的struct可以看做变量的集合,struct的问题: 空结构体占用多大内存? 例子1:空结构体的大小 #include<stdio.h> struct ST ...
- 安装scount的es驱动,composer require tamayo/laravel-scout-elastic报错解决
执行 composer require tamayo/laravel-scout-elastic 报错信息如下: Problem 1 - Installation request for tamayo ...
- 【HEVC简介】SAO-Sample Adaptive Offset, 样本自适应偏移量
paper: Sample Adaptive Offset for HEVC <HEVC标准介绍.HEVC帧间预测论文笔记>系列博客,目录见:http://www.cnblogs.com/ ...
- pycharm激活码 pycharm安装后激活方式 pycharm汉化包安装
汉化包 下载地址: 链接:http://pan.baidu.com/s/1pL6xWl9 密码:x1fh 将下载好的文件解压:将resources_cn.jar放到安装目录下的lib目录下即可 重启 ...
- (转)使用Spring注解方式管理事务与传播行为详解
http://blog.csdn.net/yerenyuan_pku/article/details/52885041 使用Spring注解方式管理事务 前面讲解了怎么使用@Transactional ...
- sqlite3:深入理解sqlite3_stmt 机制
我们在使用sqlite3的过程中,涉及到批量操作时(批量插入.批量读...),总会遇到 sqlite3_stmt这个数据类型,按照官方解释说法是这样的:sqlite3_stmt是C接口中“准备语句对象 ...
- 题目:企业发放的奖金根据利润提成。 利润(I)低于或等于10万元时,奖金可提10%; 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%; 20万到40万之间时,高于20万元的部分,可提成5%; 40万到60万之间时高于40万元的部分,可提成 3%; 60万到100万之间时,高于60万元的部分,可提成1.5%; 高于100万元时,超过
题目:企业发放的奖金根据利润提成. 利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%: 20万到 ...
- 假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?
假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少? #include <stdio.h> int main(){ , b = , c = ; print ...
- python调用aapt工具直接获取包名和tagertSdkversion
背景: 每次海外游戏上架都需要符合google的上架规则,其中适配方面tagetSdkversion有硬性要求,比如需要适配安卓q就需要tagetSdkversion达到28,水平太渣的我每次调用aa ...
- qcloudsms_py
qcloudsms_py from qcloudsms_py import SmsVoicePromptSender from qcloudsms_py.httpclient import HTTPE ...