/*
线段树区间合并
维护几个信息 到时候乱搞一下就好了
开始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 ;
}

Poj 3368 Frequent values的更多相关文章

  1. POJ 3368 Frequent values 【ST表RMQ 维护区间频率最大值】

    传送门:http://poj.org/problem?id=3368 Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total S ...

  2. poj 3368 Frequent values(RMQ)

    /************************************************************ 题目: Frequent values(poj 3368) 链接: http ...

  3. POJ 3368 Frequent values (基础RMQ)

    Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14742   Accepted: 5354 ...

  4. poj 3368 Frequent values(段树)

    Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13516   Accepted: 4971 ...

  5. POJ 3368 Frequent values RMQ ST算法/线段树

                                                         Frequent values Time Limit: 2000MS   Memory Lim ...

  6. poj 3368 Frequent values -Sparse-Table

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16537   Accepted: 5981 Description You ...

  7. POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)

    题目链接:http://poj.org/problem? id=3368 Description You are given a sequence of n integers a1 , a2 , .. ...

  8. poj 3368 Frequent values(RMQ)

    题目:http://poj.org/problem?id=3368 题意:给定n个数,顺序为非下降,询问某个区间内的数出现最多的数的 出现次数.. 大白书上的 例题..算是RMQ变形了, 对 原数组重 ...

  9. (简单) POJ 3368 Frequent values,RMQ。

    Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In ad ...

  10. POJ 3368 Frequent values(线段树区间合并)

    [题目链接] http://poj.org/problem?id=3368 [题目大意] 有一个有序序列,要求区间查询出现次数最多的数 [题解] 维护每个区间左端点和右端点,以及左右的长度,还有区间的 ...

随机推荐

  1. STM32学习笔记——USART串口(向原子哥和火哥学习)

    一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范围的波特率选择. S ...

  2. STM32学习笔记——SPI串行通讯(向原子哥学习)

    一.SPI  简介 SPI是 Serial Peripheral interface 的缩写,就是串行外围设备接口.SPI 接口主要应用在  EEPROM, FLASH,实时时钟,AD 转换器,还有数 ...

  3. vm拷贝cloudera-scm-agent造成问题

    ------------网络问题---------- ifconfig...没有看到eth0..然后重启网卡又报下面错误. 故障现象: service network restartShutting  ...

  4. 转:100个高质量Java开发者博客

    原文来自于:http://www.importnew.com/7469.html ImportNew注:原文中还没有100个.作者希望大家一起来推荐高质量的Java开发博客,然后不段补充到这个列表.欢 ...

  5. 首页重定位到mian.action上

    <body onload="top.location.href='<%=request.getContextPath()%>/main.action';">

  6. Arctic Network

    poj2349:http://poj.org/problem?id=2349 题意:有卫星电台的城市之间可以任意联络.没有卫星电台的城市只能和距离小于等于D的城市联络.告诉你卫星电台的个数S,让你求最 ...

  7. 如何用正则匹配后缀名不为.jpg, .css, .js, .html, .htm, .png的文件

    有网友碰到过这样的问题:如何用正则匹配后缀名不为.jpg, .css, .js, .html, .htm, .png的文件,问题详细内容为: 如何用正则匹配后缀名不为.jpg, .css, .js, ...

  8. 【spring-boot】spring aop 面向切面编程初接触--切点表达式

    众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...

  9. POJ 1651 Multiplication PuzzleDP方法:

    有N张写有数字的卡片排成一行,按一定次序从中拿走N-2张(第1张和最后一张不能拿),每次只拿一张,取走一张卡片的同时,会得到一个分数,分值的计算方法是:要拿的卡片,和它左右两边的卡片,这三张卡片上数字 ...

  10. 【转】Android JNI编程—JNI基础

    原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...