数据结构(分块):[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这么大,再说我又是数论鶸渣,打死也不 ...
随机推荐
- JavaScript单例模式
一.什么是单例 意思是指获取的对象只有一份. 二.最通用的单例 任何时刻获取SingLeton.instance都是同一个对象 var SingLeton={ instance:{ property: ...
- bootstrap 模态框关闭状态怎么获取
比如现在有个场景,一个事件 需要在模态框关闭之后再执行自己的逻辑,先上图: 参考官网说明:http://v3.bootcss.com/javascript/#modals-events //每次关闭模 ...
- query 防止ajax重复提交
项目用到js了,首选jquery,能用库用库,原则. 碰到重复提交的问题,禁止住才行.百度google,还是Google给力. 知乎上有个高人,总结了四种,利用Jquery .post方法返回jqXH ...
- Java GetAndPost
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...
- [DEncrypt] C# DEncrypt加密/解密帮助类(转载)
点击下载 DEncrypt.rar 这个类是关于加密,解密的操作,文件的一些高级操作1.使用 缺省密钥字符串 加密/解密string2.使用 给定密钥字符串 加密/解密string3.使用 缺省密钥字 ...
- PHP语言、浏览器、操作系统、IP、地理位置、ISP
)]; } else { $Isp = 'None'; } return $Isp; }}
- 网络编程(学习整理)---3--(Udp)FeiQ实现广播消息群发
1.广播群发消息: 这里使用的任然是UDP协议,使用方法还是比较简单的! 我就记录一下需要注意的一些地方(笔记): (1)这里是在局域网内,借用FeiQ聊天软件,编写一段程序,实现对局域网内的每一个登 ...
- 实现基于文件存储的Session类
自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 一般基于文件存储Session数据效率不是很高 ...
- Zend Studio 11.0.2 破解和汉化
本方法适用于Zend Studio 11.0.2,亲测,其他版本未知. 破解方法:覆盖安装目录 plugins 里同名文件,启动任意输入即可注册. Windows版下载地址:http://downlo ...
- CSAPP Lab2: Binary Bomb
著名的CSAPP实验:二进制炸弹 就是通过gdb和反汇编猜测程序意图,共有6关和一个隐藏关卡 只有输入正确的字符串才能过关,否则会程序会bomb终止运行 隐藏关卡需要输入特定字符串方会开启 实验材料下 ...