【题目描述】

给定一个序列,下标从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的更多相关文章

  1. Bitset([HZOI 2015]偏序++)

    Bitset简介 下面介绍C++ STL 中一个非常有用的东西: Bitset 类似于二进制状压,它可以把信息转化成一个01串存储起来 定义方法: 首先要#include<bitset>或 ...

  2. BZOJ 2287. [HZOI 2015]疯狂的机器人 [FFT 组合计数]

    2287. [HZOI 2015]疯狂的机器人 题意:从原点出发,走n次,每次上下左右不动,只能在第一象限,最后回到原点方案数 这不煞笔提,组合数写出来发现卷积NTT,然后没考虑第一象限gg 其实就是 ...

  3. 【COGS】2287:[HZOI 2015]疯狂的机器人 FFT+卡特兰数+排列组合

    [题意][COGS 2287][HZOI 2015]疯狂的机器人 [算法]FFT+卡特兰数+排列组合 [题解]先考虑一维的情况,支持+1和-1,前缀和不能为负数,就是卡特兰数的形式. 设C(n)表示第 ...

  4. [cogs2314][HZOI 2015] Persistable Editor - 可持久化平衡树

    [cogs2314][HZOI 2015]Persistable Editor - 可持久化平衡树 题目链接 首先吐槽扯淡几句 [题目描述] 维护一种可持久化的文本编辑器,支持下列操作: 1 p st ...

  5. cogs 2123. [HZOI 2015] Glass Beads

    2123. [HZOI 2015] Glass Beads ★★★   输入文件:MinRepresentations.in   输出文件:MinRepresentations.out   简单对比时 ...

  6. COGS 2580. [HZOI 2015]偏序 II

    COGS 2580. [HZOI 2015]偏序 II 题目传送门 题目大意:给n个元素,每个元素有具有4个属性a,b,c,d,求i<j并且ai<aj,bi<bj,ci<cj, ...

  7. cogs 2320. [HZOI 2015]聪聪的世界题解

    2320. [HZOI 2015]聪聪的世界 时间限制:6 s   内存限制:512 MB [题目描述] 背景: 聪聪的性取向有问题. 题目描述: 聪聪遇到了一个难题: 给出一个序列a1…an,完成以 ...

  8. 【分块】bzoj1798 [Ahoi2009]Seq 维护序列seq

    分块,打标记,维护两个标记:乘的 和 加的. 每次 区间乘的时候,对 乘标记 和 加标记 都 乘上那个值. 每次 区间加的时候 对 加标记 加上那个值. (ax+b)*v=axv+bv.开 long ...

  9. COGS 2188. [HZOI 2015] Math 题解

      题目描述: 给定n个数X1-Xn,求下面式子的值(整数部分): n<=107,xi<=109且互不相同. 分析: 其实一开始看见这道题我也吓傻了,k这么大,再说我又是数论鶸渣,打死也不 ...

随机推荐

  1. JS0热身运动

    热身热身小知识点: JS中如何获取元素: 1 通过ID名称来获取:document get element by id  -->document.getElementById() 2 .... ...

  2. json 是什么

    怎么学习一个知识? 首先要提出几个问题,目前认为json是个什么,json是谁创造的,为什么而出现的,但是目前仅有很长时间之前别人直接告诉我的,json用来存数据的,对于使用也忘记的差不多了,所以现在 ...

  3. HTML5 <a>标签download 属性

    一.简单实例 <a href="../images/1.jpg" download="下载图片.jpg"> 点击按钮下载 </a> 二. ...

  4. NHibernate动态加载资源文件

    最近做项目,又用到了以前做过的ORM框架--NHibernate. 此次想要实现的目标: 1.简单SQL用NHibernate的Session的CRUD方法实现 2.复杂SQL用Native SQL实 ...

  5. 《你不常用的c#之三》:Action 之怪状

    转载自csdn:http://blog.csdn.net/robingaoxb/article/details/6199891 例1:   public static void Main() { Li ...

  6. arcgis engine - 鹰眼在栅格图无法显示.

    一般,如果是矢量图,则不会出现这样的情况,鹰眼图无法显示,这时,只要在主控件的OnMapReplaced中显示指定鹰眼控制的空间参照,即可,如:在map_Big_OnMapReplaced方法中,添加 ...

  7. IOS-UI- UIScrollView 滚动视图(1)

    滚动视图多个页面实现的原理 滚动视图位置不变 内容的位置发生改变. 滚动视图的运用1.分页查看图片 2.查看大图片 3.当内容过多需要一个页面显示,如:注册,修改个人信息等等4.当不希望用户感觉咱们的 ...

  8. Powershell profile.ps1 cannot be loaded because its operation is blocked by software restriction policies

    Powershell profile.ps1 cannot be loaded because its operation is blocked by software restriction pol ...

  9. 跟我玩ADB——初识ADB

    ADB全称Android Debug Bridge, 是Android SDK的一个可以真实操作手机设备里面内容的工具. 一.功能介绍: 进入设备的shell进行命令行操作 使用5037端口,对设备进 ...

  10. 【原创】史上最全的Android开发环境搭建

    开始学习Android了 看着眼花缭乱的教程真心无奈...So  无耻的来了个大综合 自己充当了小白鼠.. (PS 若文章中链接失效 请留言反馈me会尽快修复) 开始的开始 java运行环境还是很必要 ...