uva 11235
数据结构 RMQ算法 左右左右 写得有点晕了 。。。。。
/*************************************************************************
> Author: xlc2845 > Mail: xlc2845@gmail.com
> Created Time: 2013年11月07日 星期四 11时05分22秒
************************************************************************/ #include <cstdio>
//#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#define LL long long
#define maxn 100010
using namespace std; int val[maxn], cou[maxn], n, q, num[maxn], left[maxn], right[maxn], d[maxn][100];
void init()
{
memset(val, 0, sizeof(val));
memset(cou, 0, sizeof(cou));
memset(d, 0, sizeof(d));
}
void init_RMQ(int k)
{
for(int i = 0; i < k; i++)
d[i][0] = cou[i];
for(int j = 1; (1 << j) <= n; j++)
for(int i = 0; i+(1 << j) - 1 < n; i++)
d[i][j] = max(d[i][j-1], d[i+(1 << (j-1))][j-1]);
}
int RMQ(int L, int R)
{
if(L > R)
return 0;
int k = 0;
while((1 << (k+1)) <= R-L+1) k++;
return max(d[L][k], d[R-(1 << k)+1][k]);
}
int main()
{
while(scanf("%d", &n) == 1 && n)
{
init();
scanf("%d",&q);
int j = 1, x;
scanf("%d", &x);
left[j] = 1;
num[1] = j;
val[1] = x;
cou[1] = 1;
for(int i = 2; i <= n; i++)
{
scanf("%d", &x);
if(x == val[j])
{
num[i] = j;
cou[j]++;
}
else
{
right[j] = i-1;
j++;
val[j] = x;
num[i] = j;
cou[j] ++;
left[j] = i;
}
}
right[j] = n;
init_RMQ(j);
while(q--)
{
int rr,ll;
scanf("%d%d", &ll, &rr);
int R = num[rr], L = num[ll];
if(R == L) printf("%d\n", rr-ll+1);
else
{
int ans = right[L]-ll+1;
ans = max(rr-left[R]+1, ans);
ans = max(ans, RMQ(L+1, R-1));
printf("%d\n",ans);
}
}
}
return 0;
}
uva 11235的更多相关文章
- UVA 11235 (游程编码+ST算法)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23846 题目大意:给定一个升序序列,有q次询问,每次询问(L,R) ...
- UVA 11235 Frequent values 线段树/RMQ
vjudge 上题目链接:UVA 11235 *******************************************************大白书上解释**************** ...
- RMQ算法 以及UVA 11235 Frequent Values(RMQ)
RMQ算法 简单来说,RMQ算法是给定一组数据,求取区间[l,r]内的最大或最小值. 例如一组任意数据 5 6 8 1 3 11 45 78 59 66 4,求取区间(1,8) 内的最大值.数据量小 ...
- UVA 11235 频繁出现的数值 RMQ
题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA - 11235 Frequent values
2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem F ...
- UVa 11235 RMQ
首先讲一下RMQ算法的意思. RMQ(Range Minimum Query,RMQ)范围最小值,给出一个n个元素的数组,计算min(A[L],A[L+1],...,A[R-1],A[R]): 这里运 ...
- UVA 11235 Frequent Values ---RMQ
大白书上的例题,具体讲解见大白书,最好用用一个Log数组直接求k,这样就是纯O(1)了 #include <iostream> #include <cstdio> #inclu ...
- UVa 11235 (RMQ) Frequent values
范围最值问题,O(nlogn)的预处理,O(1)的查询. 这个题就是先对这些数列进行游程编码,重复的元素只记录下重复的次数. 对于所查询的[L, R]如果它完全覆盖了某些连续的重复片段,那么查询的就是 ...
- [POJ] 3368 / [UVA] 11235 - Frequent values [ST算法]
2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem F ...
随机推荐
- VxWorks 6.9 内核编程指导之读书笔记 -- POSIX
POSIX能力 VxWorks扩展了POSIX,为了移植,VxWorks提供了额外的POSIX接口作为可选组件.VxWorks实现了POSIX 1003.1(POSIX .1)一些传统接口以及POSI ...
- AMQ学习笔记 - 15. 实践方案:基于ActiveMQ的统一日志服务
概述 以ActiveMQ + Log4j + Spring的技术组合,实现基于消息队列的统一日志服务. 参考:Spring+Log4j+ActiveMQ实现远程记录日志——实战+分析 与参考文章的比较 ...
- JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)
一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...
- SilverLight命名空间详解-新手入门
1.核心命名空间 1.xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"是silverlight的核 ...
- c++11: bind用法
原型: template< class R, class F, class... Args > bind( F&& f, Args&&... args ); ...
- css解决IE6、Chrome、ff 浏览器position:fixed;和闪动问题
首先说下开发模式,刚刚开始接触,基本沿用web端开发方式,目前开发模式上没有找到的适合的,现在基本这样:1,电脑nginx配置服务器3,电脑和手机连同一个局域网,2,android root 和 ip ...
- CenterOS中安装Redis及开机启动设置
Redis安装 从官方下载最新Redis进行安装,官网地址:http://redis.io/download $ wget http://download.redis.io/releases/redi ...
- 使用tortoise git管理gitolite版本库
gitolite-admin是用于管理git版本库的版本库,将其从服务器上clone下来. 使用tortoise git clone的时候需要指定私钥,私钥的格式是ppk的,需要使用putty的PUT ...
- Hibernate 插入,修改,删除,查询语句
/* *具体操作hibernate的类 *增加,删除,修改,按ID查询,模糊查询,查询全部 **/ public class PersonOperate { //在hibernate中所有操作都是由S ...
- wxPython + Boa 练习程序
最近需要做点支持linux的跨平台gui,网上查到了wxPython及Boa,感觉不错,照着Boa文档做做练习. 代码: App: #!/usr/bin/env python #Boa:App:Boa ...