【题目描述】

给定一个序列,下标从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. JavaScript单例模式

    一.什么是单例 意思是指获取的对象只有一份. 二.最通用的单例 任何时刻获取SingLeton.instance都是同一个对象 var SingLeton={ instance:{ property: ...

  2. bootstrap 模态框关闭状态怎么获取

    比如现在有个场景,一个事件 需要在模态框关闭之后再执行自己的逻辑,先上图: 参考官网说明:http://v3.bootcss.com/javascript/#modals-events //每次关闭模 ...

  3. query 防止ajax重复提交

    项目用到js了,首选jquery,能用库用库,原则. 碰到重复提交的问题,禁止住才行.百度google,还是Google给力. 知乎上有个高人,总结了四种,利用Jquery .post方法返回jqXH ...

  4. Java GetAndPost

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  5. [DEncrypt] C# DEncrypt加密/解密帮助类(转载)

    点击下载 DEncrypt.rar 这个类是关于加密,解密的操作,文件的一些高级操作1.使用 缺省密钥字符串 加密/解密string2.使用 给定密钥字符串 加密/解密string3.使用 缺省密钥字 ...

  6. PHP语言、浏览器、操作系统、IP、地理位置、ISP

    )]; } else { $Isp = 'None'; } return $Isp; }}

  7. 网络编程(学习整理)---3--(Udp)FeiQ实现广播消息群发

    1.广播群发消息: 这里使用的任然是UDP协议,使用方法还是比较简单的! 我就记录一下需要注意的一些地方(笔记): (1)这里是在局域网内,借用FeiQ聊天软件,编写一段程序,实现对局域网内的每一个登 ...

  8. 实现基于文件存储的Session类

    自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 一般基于文件存储Session数据效率不是很高 ...

  9. Zend Studio 11.0.2 破解和汉化

    本方法适用于Zend Studio 11.0.2,亲测,其他版本未知. 破解方法:覆盖安装目录 plugins 里同名文件,启动任意输入即可注册. Windows版下载地址:http://downlo ...

  10. CSAPP Lab2: Binary Bomb

    著名的CSAPP实验:二进制炸弹 就是通过gdb和反汇编猜测程序意图,共有6关和一个隐藏关卡 只有输入正确的字符串才能过关,否则会程序会bomb终止运行 隐藏关卡需要输入特定字符串方会开启 实验材料下 ...