数据结构(分块):[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这么大,再说我又是数论鶸渣,打死也不 ...
随机推荐
- JS0热身运动
热身热身小知识点: JS中如何获取元素: 1 通过ID名称来获取:document get element by id -->document.getElementById() 2 .... ...
- json 是什么
怎么学习一个知识? 首先要提出几个问题,目前认为json是个什么,json是谁创造的,为什么而出现的,但是目前仅有很长时间之前别人直接告诉我的,json用来存数据的,对于使用也忘记的差不多了,所以现在 ...
- HTML5 <a>标签download 属性
一.简单实例 <a href="../images/1.jpg" download="下载图片.jpg"> 点击按钮下载 </a> 二. ...
- NHibernate动态加载资源文件
最近做项目,又用到了以前做过的ORM框架--NHibernate. 此次想要实现的目标: 1.简单SQL用NHibernate的Session的CRUD方法实现 2.复杂SQL用Native SQL实 ...
- 《你不常用的c#之三》:Action 之怪状
转载自csdn:http://blog.csdn.net/robingaoxb/article/details/6199891 例1: public static void Main() { Li ...
- arcgis engine - 鹰眼在栅格图无法显示.
一般,如果是矢量图,则不会出现这样的情况,鹰眼图无法显示,这时,只要在主控件的OnMapReplaced中显示指定鹰眼控制的空间参照,即可,如:在map_Big_OnMapReplaced方法中,添加 ...
- IOS-UI- UIScrollView 滚动视图(1)
滚动视图多个页面实现的原理 滚动视图位置不变 内容的位置发生改变. 滚动视图的运用1.分页查看图片 2.查看大图片 3.当内容过多需要一个页面显示,如:注册,修改个人信息等等4.当不希望用户感觉咱们的 ...
- 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 ...
- 跟我玩ADB——初识ADB
ADB全称Android Debug Bridge, 是Android SDK的一个可以真实操作手机设备里面内容的工具. 一.功能介绍: 进入设备的shell进行命令行操作 使用5037端口,对设备进 ...
- 【原创】史上最全的Android开发环境搭建
开始学习Android了 看着眼花缭乱的教程真心无奈...So 无耻的来了个大综合 自己充当了小白鼠.. (PS 若文章中链接失效 请留言反馈me会尽快修复) 开始的开始 java运行环境还是很必要 ...