数据结构(分块):[HZOI 2015]easy seq
【题目描述】
给定一个序列,下标从0开始,分别为a0,a1,a2...an−1,有m个询问,每次给出l和r,求满足ai=aj且l<=i<=j<=r时j−i的最大值
本题强制在线,l和r均进行了加密,解密过程为
l′=min((l+ans)modn,(r+ans)modn)
r′=max((l+ans)modn,(r+ans)modn)
其中ans为上次答案
【输入格式】
第一行,两个正整数n,m
第二行,n个非负整数a0,a1,a2...an−1
以下m行,每行两个数l,r,表示询问
【输出格式】
m行,表示答案
【样例输入】
5 3
0 4 0 0 1
3 2
4 1
0 0
【样例输出】
1
2
0
0<=l,r<n
【来源】
国家集训队2015论文集
离线预处理+分块,复杂度有保障。
#include <cstdio>
const int N=,M=,B=;
int n,Q,lmn[N][M],rmx[N][M];
int dp[M][M],a[N],bel[N];
int fst[N][M],lst[N][M];
int st[M],ed[M],tot;
int h[N],vis[N],tim;
char c;int x;
__inline int min(int x,int y){return x>y?y:x;}
__inline int max(int x,int y){return x<y?y:x;}
__inline int Read(){
while(x=getchar()-,x>||x<);
while(c=getchar()-,c<=&&c>=)x=x*+c;
return x;
}
int main(){
freopen("easy_seq.in","r",stdin);
freopen("easy_seq.out","w",stdout);
scanf("%d%d",&n,&Q);
for(register int i=;i<=n;i++)a[i]=Read();
for(register int i=;i<=n;i++)bel[i]=(i-)/B+;
for(register int i=;i<=n;i++)ed[bel[i]]=i;
for(register int i=n;i>=;i--)st[bel[i]]=i; tot=bel[n]; for(register int i=n;i>=;i--)fst[a[i]][bel[i]]=i;
for(register int i=;i<=n;i++)lst[a[i]][bel[i]]=i; for(register int i=;i<=n;i++){
for(register int j=;j<=bel[i];j++)
lmn[i][j]=fst[a[i]][j];
for(register int j=bel[i];j<=tot;j++)
rmx[i][j]=lst[a[i]][j];
} for(register int i=;i<=n;i++){
for(register int j=bel[i]-;j>=;j--)
if(!lmn[i][j])lmn[i][j]=lmn[i][j+];
else lmn[i][j]=min(lmn[i][j],lmn[i][j+]);
for(register int j=bel[i]+;j<=tot;j++)
rmx[i][j]=max(rmx[i][j],rmx[i][j-]);
} for(register int j=,i;j<=n;j++){i=bel[j];
dp[i][i]=max(dp[i][i],lst[a[j]][i]-j);
dp[i][i]=max(dp[i][i],j-fst[a[j]][i]);
} for(register int k=;k<=tot;k++)
for(register int i=,j;(j=i+k-)<=tot;i++){
dp[i][j]=max(dp[i][j-],dp[i+][j]);
for(register int t=st[i];t<=ed[i];t++)
dp[i][j]=max(dp[i][j],rmx[t][j]-t);
}
int l_,r_,l,r,ans=;
while(Q--){
l=Read();r=Read();
l_=min((l+ans)%n,(r+ans)%n);
r_=max((l+ans)%n,(r+ans)%n);
l=l_+;r=r_+; if(bel[l]==bel[r]){
++tim;ans=;
for(register int i=l;i<=r;i++){
if(vis[a[i]]!=tim){
vis[a[i]]=tim;
h[a[i]]=i;
}
else ans=max(ans,i-h[a[i]]);
}
printf("%d\n",ans);
continue;
} if(st[bel[l]]!=l)l_=ed[bel[l]]+;else l_=l;
if(ed[bel[r]]!=r)r_=st[bel[r]]-;else r_=r; ans=dp[bel[l_]][bel[r_]];++tim;
for(register int i=l;i<l_;i++){
ans=max(ans,rmx[i][bel[r_]]-i);
if(vis[a[i]]!=tim){
vis[a[i]]=tim;
h[a[i]]=i;
}
else ans=max(ans,i-h[a[i]]);
}
for(register int i=r_+;i<=r;i++){
if(!lmn[i][bel[l_]])lmn[i][bel[l_]]=n;
ans=max(ans,i-lmn[i][bel[l_]]);
if(vis[a[i]]!=tim){
vis[a[i]]=tim;
h[a[i]]=i;
}
else ans=max(ans,i-h[a[i]]);
}
printf("%d\n",ans);
}
return ;
}
数据结构(分块):[HZOI 2015]easy seq的更多相关文章
- Bitset([HZOI 2015]偏序++)
Bitset简介 下面介绍C++ STL 中一个非常有用的东西: Bitset 类似于二进制状压,它可以把信息转化成一个01串存储起来 定义方法: 首先要#include<bitset>或 ...
- BZOJ 2287. [HZOI 2015]疯狂的机器人 [FFT 组合计数]
2287. [HZOI 2015]疯狂的机器人 题意:从原点出发,走n次,每次上下左右不动,只能在第一象限,最后回到原点方案数 这不煞笔提,组合数写出来发现卷积NTT,然后没考虑第一象限gg 其实就是 ...
- 【COGS】2287:[HZOI 2015]疯狂的机器人 FFT+卡特兰数+排列组合
[题意][COGS 2287][HZOI 2015]疯狂的机器人 [算法]FFT+卡特兰数+排列组合 [题解]先考虑一维的情况,支持+1和-1,前缀和不能为负数,就是卡特兰数的形式. 设C(n)表示第 ...
- [cogs2314][HZOI 2015] Persistable Editor - 可持久化平衡树
[cogs2314][HZOI 2015]Persistable Editor - 可持久化平衡树 题目链接 首先吐槽扯淡几句 [题目描述] 维护一种可持久化的文本编辑器,支持下列操作: 1 p st ...
- cogs 2123. [HZOI 2015] Glass Beads
2123. [HZOI 2015] Glass Beads ★★★ 输入文件:MinRepresentations.in 输出文件:MinRepresentations.out 简单对比时 ...
- COGS 2580. [HZOI 2015]偏序 II
COGS 2580. [HZOI 2015]偏序 II 题目传送门 题目大意:给n个元素,每个元素有具有4个属性a,b,c,d,求i<j并且ai<aj,bi<bj,ci<cj, ...
- cogs 2320. [HZOI 2015]聪聪的世界题解
2320. [HZOI 2015]聪聪的世界 时间限制:6 s 内存限制:512 MB [题目描述] 背景: 聪聪的性取向有问题. 题目描述: 聪聪遇到了一个难题: 给出一个序列a1…an,完成以 ...
- 【分块】bzoj1798 [Ahoi2009]Seq 维护序列seq
分块,打标记,维护两个标记:乘的 和 加的. 每次 区间乘的时候,对 乘标记 和 加标记 都 乘上那个值. 每次 区间加的时候 对 加标记 加上那个值. (ax+b)*v=axv+bv.开 long ...
- COGS 2188. [HZOI 2015] Math 题解
题目描述: 给定n个数X1-Xn,求下面式子的值(整数部分): n<=107,xi<=109且互不相同. 分析: 其实一开始看见这道题我也吓傻了,k这么大,再说我又是数论鶸渣,打死也不 ...
随机推荐
- [访问系统] C#计算机信息类ComputerInfo (转载)
下载整个包,只下载现有类是不起作用的 http://www.sufeinet.com/thread-303-1-1.html 点击此处下载 using System; using System.Man ...
- iis最大连接数和队列长度
最近公司项目的服务器出现了性能问题,关于iis负载过大,当客户问到最大连接数相关问题造成很萌的感觉,就查了相关资料: 首先让我们来看看IIS里面的这2个数字:最大并发连接数,队列长度.先说这2个数字在 ...
- Oracle学习第三讲
关联查询 笛卡尔积 指做关联操作的每个表的每一行都和其他表的每一行组合,假设两个表的记录条数分别为x和y,笛卡尔积将返回x*y条记录 例如:select count(*) from emp; sele ...
- Java--获取request中所有参数的方法
我们通常用到request获取某个参数的方法: String value=request.getparameter("key"); 如果想要获取request中所有的参数呢? re ...
- java动态绑定的情况分析
java是面向对象的语言,java中多态的一种情况是动态绑定.所谓的动态绑定,分两种情况:当调用类方法的时候,java虚拟机会基于对象的引用类型来选择执行方法.当java调用一个实例方法的时候,他会根 ...
- JS实时监听浏览器宽度的变化
boot:function(){ //加载页面时执行一次 changeMargin(); //监听浏览器宽度的改变 window.onresize = function(){ changeMargin ...
- 菜鸟日记之 java中的集合框架
java中的集合框架图 如图所示:java中的集合分为两种Collection和Map两种接口 可分为Collection是单列集合和Map的双列集合 Collection单列集合:继承了Iterat ...
- MySql模糊查询like通配符使用详细介绍
MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi.grep和sed的扩展正则表达式模式匹配的格式. 一.SQL模式 SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹 ...
- Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
由浅入深,主要介绍maven的用途.核心概念(Pom.Repositories.Artifact.Build Lifecycle.Goal).用法(Archetype意义及创建各种项目).maven常 ...
- Python 关于正负无穷float(‘inf’)的一些用法
Python中可以用如下方式表示正负无穷: float("inf"), float("-inf") 利用 inf 做简单加.乘算术运算仍会得到 inf > ...