巴蜀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 ...
随机推荐
- 微信小程序 逻辑层
1. 注册程序小程序APP在小程序的根目录下有一个app.js文件.有App(Object),App() 函数用来注册一个小程序.接受一个 Object 参数,其内便是小程序的生命周期.App() 必 ...
- 我的关于phoneGap的安装及测试。
一.PhoneGap简介 PhoneGap是一个用基于HTML,CSS和JavaScript的,创建移动跨平台移动应用程序的快速开发平台.它使开发者能够利用 iPhone,Android,Palm,S ...
- saltstack 源码安装
面向对象编程(oop) 面向对象: 面向对象三大特性: 封装 继承 多肽封装: 封装就是将具体的客观事物封装成抽象的类.并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可行的进行信息隐藏继承 ...
- DROP FUNCTION - 删除一个函数
SYNOPSIS DROP FUNCTION name ( [ type [, ...] ] ) [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP FUNCTION ...
- 安卓获取数据demo出现的问题
时间戳是long型的数据,但其他数据都是float型,但AsyncTask要求是统一数据类型.这样我就不能把时间戳放进AsyncTask里面进行处理,我就在doInBackground中获取时间戳然后 ...
- log4j.xml 精选的log4j.xml文档,比较详细,网上的版本很多,这个版本相对而言比较完整
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE log4j:configuration PUB ...
- [BZOJ3940]:[Usaco2015 Feb]Censoring(AC自动机)
题目传送门 题目描述: FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过105的字符串S.他有一个包含n个单词的列表,列表里的n个单词记为t1…tN.他希望从S中删除这些单词.FJ每次在S中 ...
- vscode 中文设置
修改设置 语言设置介绍: https://code.visualstudio.com/docs/getstarted/locales 按Ctrl + Shift + P打开命令调色板,然后开始键入“d ...
- 2018 CCPC 女生赛 hdoj6287 口算训练
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6287 Summarize: 1.分解质因数: 2.二分查找函数lower_bound与upper_bo ...
- 万能的搜索--之BFS(三)
接着(一)start (二)广度优先搜索(BFS) 广度优先搜索(又称宽度优先搜索算法)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型. Dijkstra单源最短路径算法和Pri ...