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

    EntityFramework  - Migrations 對項目進行EF的數據庫升級操作.分爲開發環境與部署環境.上的操作總結. 引用: Command說明https://coding.abel.n ...

  2. C语言陷阱——类型转换

    以下例子取自<深入理解计算机系统>. 考虑如下的C语言代码: #include<stdio.h> typedef unsigned char* byte_pointer; vo ...

  3. MySQL 执行计划explain详解

    MySQL 执行计划explain详解 2015-08-10 13:56:27 分类: MySQL explain命令是查看查询优化器如何决定执行查询的主要方法.这个功能有局限性,并不总会说出真相,但 ...

  4. 转:PHP的线程安全ZTS与非线程(NTS)安全版本的区别

    原文来自于:http://blog.sina.com.cn/s/blog_94c21e8f0101s2ic.html Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和 ...

  5. hadoop hdfs 命令行 设置文件夹大小的上限 quota:配额

    >bin/hdfs dfs -put readme.txt /finance >bin/hdfs dfs -du -s /finance > /finance >bin/hdf ...

  6. Node.js事件循环

    Node JS是单线程应用程序,但它通过事件和回调概念,支持并发. 由于Node JS每一个API是异步的,作为一个单独的线程,它使用异步函数调用,以保持并发性.Node JS使用观察者模式.Node ...

  7. C# static成员的构造顺序

    熟知的几个原则 1.static字段初始化先于static构造函数 2.static字段按顺序初始化 3.static字段和static构造函数只执行一次 public class Foo { pub ...

  8. jQuery折叠风琴

    这个效果用jQuery做是很方便的,根本不需要搞得很复杂. 网上有些效果DEMO不仅用了jQuery还引用一两个封装文件,真是匪夷所思. 最初想到了toggle: jQuery(document).r ...

  9. STM8S 模拟I2C程序

    STM8S的硬件I2C还是存在问题,不敢贸然使用. 于是决定用模拟I2C. #define SCL PE_ODR_ODR1 #define SDA PE_ODR_ODR2 #define SDAM P ...

  10. POJ-1330--Nearest Common Ancestors(离线LCA)

    LCA离线算法 它需要一次输入所有的询问,然后有根节点开始进行深度优先遍历(DFS),在深度优先遍历的过程中,进行并查集的操作,同时查询询问,返回结果. 题意: 求A ,B两点的最近公共祖先 分析: ...