/*
线段树区间合并
维护几个信息 到时候乱搞一下就好了
开始T了 有一种情况可以不用递归 直接算出来
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
#define lc (k<<1)
#define rc (k<<1)+1
#define mid ((l+r)>>1)
using namespace std;
int n,m,a[maxn],ls[maxn*],rs[maxn*],ln[maxn*],rn[maxn*],s[maxn*];
int init(){
int x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
void Build(int k,int l,int r){
if(l!=r){
Build(lc,l,mid);
Build(rc,mid+,r);
s[k]=max(s[lc],s[rc]);
if(rn[lc]==ln[rc])
s[k]=max(s[k],rs[lc]+ls[rc]);
ln[k]=ln[lc];rn[k]=rn[rc];
ls[k]=ls[lc];rs[k]=rs[rc];
if(ls[lc]==mid-l+&&rn[lc]==ln[rc])
ls[k]=max(ls[k],ls[lc]+ls[rc]);
if(rs[rc]==r-mid&&rn[lc]==ln[rc])
rs[k]=max(rs[k],rs[rc]+rs[lc]);
}
else{
ls[k]=rs[k]=;ln[k]=rn[k]=a[l];s[k]=;
}
}
int Query(int k,int l,int r,int x,int y){
if(x<=l&&y>=r)return s[k];
int ret=,L,R;
if(y<=mid)return Query(lc,l,mid,x,y);
else if(x>mid)return Query(rc,mid+,r,x,y);
else{
if(rn[lc]==ln[rc]){
L=max(mid-rs[lc]+,x);
R=min(mid+ls[rc],y);
ret=mid-L++R-mid;
}
//ret=Query(lc,l,mid,max(mid-rs[lc]+1,x),mid)
//+Query(rc,mid+1,r,mid+1,min(mid+ls[rc],y));可以只结算出来 QAQ T了好几遍
ret=max(ret,Query(lc,l,mid,x,y));
ret=max(ret,Query(rc,mid+,r,x,y));
}
return ret;
}
int main()
{
while(){
n=init();if(n==)break;
m=init();
for(int i=;i<=n;i++)a[i]=init();
Build(,,n);
while(m--){
int L,R;
L=init();R=init();
printf("%d\n",Query(,,n,L,R));
}
}
return ;
}
/*
ST表做法 比较巧妙 时间差不多 空间大一些
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
using namespace std;
int n,m,a[maxn],c[maxn],f[maxn][],lst[maxn],p[maxn];
int init(){
int x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
void Clear(){
memset(c,,sizeof(c));
memset(f,,sizeof(f));
memset(lst,,sizeof(lst));
}
void Get_p(){
for(int i=;i<=maxn-;i++)
for(int j=;j<=;j++)
if((<<j)>i){
p[i]=j-;break;
}
}
void Get_ST(){
for(int i=;i<=n;i++)f[i][]=c[i];
for(int j=;j<=;j++)
for(int i=;i+(<<j)-<=n;i++)
f[i][j]=max(f[i][j-],f[i+(<<j-)][j-]);
}
int Query(int l,int r){
if(l>r)return ;
int k=p[r-l+];
return max(f[l][k],f[r-(<<k)+][k]);
}
int main()
{
Get_p();
while(){
n=init();if(n==)break;m=init();
Clear();
for(int i=;i<=n;i++)a[i]=init();
for(int i=;i<=n;i++)
if(a[i]==a[i-])c[i]=c[i-]+;
else c[i]++;
for(int i=n;i>=;i--)
if(a[i]==a[i+])lst[i]=lst[i+];
else lst[i]=i;
Get_ST();
while(m--){
int L,R,mxx=,mx=;
L=init();R=init();
mxx=Query(lst[L]+,R);
mx=min(lst[L],R)-L+;
printf("%d\n",max(mxx,mx));
}
}
return ;
}

最新文章

  1. 基于jquery实现图片拖动和曲线拖放
  2. explain 执行计划详解
  3. javascript之冒泡算法
  4. css 雪碧图的制作
  5. java中的正则操作总结
  6. tomcat work 目录
  7. Spark应用程序的运行框架
  8. Selective Search for Object Recognition 论文笔记【图片目标分割】
  9. python接口自动化(十三)--cookie绕过验证码登录(详解)
  10. ZJOI2019游记
  11. 关于select的使用感受~大坑~select不能添加点击事件触发~
  12. Python_每日习题_0002_个税计算
  13. mysql 与linux ~ 内存分析与调优
  14. spring-boot-2.0.3启动源码篇二 - run方法(一)之SpringApplicationRunListener
  15. CSS自定义滚动条样式
  16. sql server递归日期
  17. mySQL 教程 第4章 数据查询
  18. Spring MVC 异常处理 - DefaultHandlerExceptionResolver
  19. SQL-字符串连接聚合函数
  20. git 移除某个文件的版本管理

热门文章

  1. python【第三篇】函数
  2. php开发学习目录
  3. HDU 1069 Monkey and Banana(LIS最长上升子序列)
  4. 单例-b
  5. 通过GetManifestResourceStream加载文件出现错误提示“null值”对于“stream”无效[转]
  6. CSS也可以改变图片幅面尺寸
  7. Tomcat error: A child container failed during start
  8. PGA突破pga_aggregate_target限制
  9. Linux系统下用户行为审计
  10. 【转】图说Android的8年演变史