BZOJ 2724: [Violet 6]蒲公英
2724: [Violet 6]蒲公英
Time Limit: 40 Sec Memory Limit: 512 MB
Submit: 1633 Solved: 563
[Submit][Status][Discuss]
Description
Input
修正一下
l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1
Output
Sample Input
1 2 3 2 1 2
1 5
3 6
1 5
Sample Output
2
1
HINT
修正下:
n <= 40000, m <= 50000
Source
分析:
第一次写分块的题目...所以无耻的copyhzwer...
感觉数据范围不大,可以用分块暴力...
对于两个整块ab,他们的众数一定存在于mode(a)∪b...脑补一下...
所以对于一个区间[l,r]的众数一定存在于中间整块的众数和两边不整块的所有数字...
这样我们如果可以快速查询区间[l,r]的x出现次数就能够解决问题...可以对于每个权值维护一个vector存下来它出现的位置(从大到小),然后二分查询就好了...
这样预处理的复杂度是n√n的,查询的复杂度是n√nlgn的...
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<map>
//by NeighThorn
using namespace std; const int maxn=+,blo=; map<int,int> mp; vector<int> v[maxn]; int n,m,cnt,ans,a[maxn],id[maxn],tot[maxn],val[maxn],f[+][+]; inline void init(int x){
int mode=,maxcnt=;
memset(tot,,sizeof(tot));
for(int i=(x-)*blo+;i<=n;i++){
tot[a[i]]++;
if(tot[a[i]]>maxcnt||(tot[a[i]]==maxcnt&&val[a[i]]<val[mode]))
mode=a[i],maxcnt=tot[a[i]];
f[x][id[i]]=mode;
}
} inline int qrycnt(int l,int r,int x){
return upper_bound(v[x].begin(),v[x].end(),r)-lower_bound(v[x].begin(),v[x].end(),l);
} inline int query(int l,int r){
int mode=f[id[l]+][id[r]-],maxcnt=qrycnt(l,r,mode);
for(int i=l;i<=min(r,id[l]*blo);i++){
int tmp=qrycnt(l,r,a[i]);
if(tmp>maxcnt||(tmp==maxcnt&&val[a[i]]<val[mode]))
mode=a[i],maxcnt=tmp;
}
if(id[l]!=id[r]){
for(int i=(id[r]-)*blo+;i<=r;i++){
int tmp=qrycnt(l,r,a[i]);
if(tmp>maxcnt||(tmp==maxcnt&&val[a[i]]<val[mode]))
mode=a[i],maxcnt=tmp;
}
}
return mode;
} signed main(void){
ans=cnt=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
if(mp.find(a[i])==mp.end())
mp[a[i]]=++cnt,val[cnt]=a[i];
a[i]=mp[a[i]];v[a[i]].push_back(i);
}
for(int i=;i<=n;i++)
id[i]=(i-)/blo+;
for(int i=;i<=id[n];i++)
init(i);
for(int i=,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
x=(x+ans-)%n+,y=(y+ans-)%n+;
if(x>y)
swap(x,y);
ans=val[query(x,y)];
printf("%d\n",ans);
}
return ;
}
by NeighThorn
BZOJ 2724: [Violet 6]蒲公英的更多相关文章
- BZOJ 2724: [Violet 6]蒲公英( 分块 )
虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...
- [BZOJ 2724] [Violet 6] 蒲公英 【分块】
题目链接:BZOJ - 2724 题目分析 这道题和 BZOJ-2821 作诗 那道题几乎是一样的,就是直接分块,每块大小 sqrt(n) ,然后将数字按照数值为第一关键字,位置为第二关键字排序,方便 ...
- 【刷题】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: [Violet 6]蒲公英 [分块 区间众数]
传送门 题面太美不忍不放 分块分块 这种题的一个特点是只有查询,通常需要预处理:加入修改的话需要暴力重构预处理 预处理$f[i][j]$为第i块到第j块的众数,显然$f[i][j]=max{f[i][ ...
- BZOJ.2724.[Violet 6]蒲公英(静态分块)
题目链接 区间众数 强制在线 考虑什么样的数会成为众数 如果一个区间S1的众数为x,那么S1与新区间S2的并的众数只会是x或S2中的数 所以我们可以分块先预处理f[i][j]表示第i到第j块的众数 对 ...
- BZOJ 2724 [Violet 6]蒲公英(分块)
题意 在线区间众数 思路 预处理出 f[i][j] 即从第 i 块到第 j 块的答案.对于每个询问,中间的整块直接用预处理出的,两端的 sqrtn 级别的数暴力做,用二分查找它们出现的次数.每次询问的 ...
- 【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 ...
- 二分+最短路判定 BZOJ 2709: [Violet 1]迷宫花园
BZOJ 2709: [Violet 1]迷宫花园 Sample Input 5 ######### # # # # # # # #S# # ##### # # ## # # # ### ### ## ...
随机推荐
- 退出多个activity的方法
1.使用List集合方式 用list保存activity实例,然后逐一干掉 import java.util.LinkedList; import java.util.List; import and ...
- android studio 使用SVN 锁定文件,防止别人修改(基于Android studio 1.4 )
首先假设开发 A , 和 开发 B , 在使用 SVN 进行项目管理.那么A如何才能 某个锁定文件,防止B修改. 1.第一步,给这个文件加锁 完成这一步,则这个文件就别锁定了. 2.第二步,假如 ...
- objective-c系列-NSMutableString
********************************************** NSMutableString为NSString的子类,除了父类的方法,NSMutableStirng还有 ...
- 从DACPAC文件中读取元数据
SQL数据库项目生成时会生成dacpac文件,可从中读出所需的元数据,进行一些转换(如生成数据字典) var model = new TSqlModel(@"D:\kljob\CardL ...
- 玩了一天的Git
今天的逗比事 Git从学习到使用,也有2个月时间了,一开始也就看看廖雪峰老师的Git教程,跟着做了一遍,感觉非常受用. 遇到一些忘掉的命令,再回去查查也基本都没问题. 但是今天缺遇到了逗比事,回过头来 ...
- BootStrap入门教程 (一)
BootStrap入门教程 (一) 2011年,twitter的"一小撮"工程师为了提高他们内部的分析和管理能力,用业余时间为他们的产品构建了一套易用.优雅.灵活.可扩展的前端 ...
- Spring MVC - 配置Spring MVC
写在前面的话: 现在开始一段新的学习历程:Spring MVC.还是按照原来的三步走学习模式(what.why.how)进行讲解. 1.Spring MVC是什么(what) Spring MVC属于 ...
- [Java入门笔记] Java语言简介
前言 学习Java有一段时间了,但是一直缺少一个系统的思想,现在重新通过书籍中.网上的文章,视频等资料,整理与回顾Java的知识点. 言归正传,让我们先从了解Java语言开始. Java语言的由来 J ...
- 高性能MySQL笔记:第1章 MySQL架构
MySQL 最重要.最与众不同的特性是他的存储引擎架构,这种架构的设计将查询处理(Query Precessing)及其系统任务(Server Task)和数据的存储/提取相分离. 1.1 MyS ...
- 二、Android学习第二天——初识Activity(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 一. Android学习第二天——初识Activity 昨天程序搭建成功以 ...