《算法竞赛入门经典-训练指南》P198
记录一下区间的左右边界就可以了
#include <iostream>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <vector>
#include <cstring>
#include <algorithm> #define INF 0x7fffffff
#define N 100010
#define M 1000010
#define LL long long
#define mod 95041567 using namespace std; int arr[N];
int num[N][3];
int dp[N][20]; void RMQ_init(int len){
for(int j = 1; (1 << j) <= len; ++ j)
for(int i = 1; i + (1 << j) - 1 < len; ++ i)
dp[i][j] = max(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
} int RMQ(int L, int R){
if(R < L) return 0;
else if(R == L) return dp[R][0];
int k = 0;
while((1 << (k + 1)) <= R - L + 1) ++ k;
return max(dp[L][k], dp[R - (1 << k) + 1][k]);
} int main()
{
int n, q;
// freopen("in.txt","r",stdin);
while(scanf("%d", &n) != EOF){
if(! n) break;
scanf("%d", &q);
for(int i = 0; i < n; ++ i) scanf("%d", &arr[i]);
for(int i = 0; i <= n + 2; ++ i)
for(int j = 0; j <= 20; ++ j)
dp[i][j] = 0;
arr[n] = INF;
int p = 0;
int len = 0;
for(int i = 1; i <= n; ++ i)
if(arr[i] != arr[i - 1]){
for(int j = p; j <= i - 1; ++ j){
num[j][0] = i - 1;
num[j][1] = p;
num[j][2] = len;
}
dp[len ++][0] = i - p;
p = i;
}
RMQ_init(len);
int L, R;
for(int i = 0; i < q; ++ i){
scanf("%d %d", &L, &R);
if(arr[L - 1] == arr[R - 1]){
printf("%d\n", R - L + 1);
continue;
}
//printf("%s\n", "++");
p = num[L - 1][0] - (L - 1) + 1;
p = max(p, R - num[R - 1][1]);
p = max(p, RMQ(num[L - 1][2] + 1, num[R - 1][2] - 1));
printf("%d\n", p);
}
}
return 0;
}

11235 - Frequent values的更多相关文章

  1. RMQ算法 以及UVA 11235 Frequent Values(RMQ)

    RMQ算法 简单来说,RMQ算法是给定一组数据,求取区间[l,r]内的最大或最小值. 例如一组任意数据 5 6 8 1 3 11 45 78 59 66 4,求取区间(1,8)  内的最大值.数据量小 ...

  2. UVA - 11235 Frequent values

    2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem F ...

  3. 数据结构(RMQ):UVAoj 11235 Frequent values

    Frequent values You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. I ...

  4. [POJ] 3368 / [UVA] 11235 - Frequent values [ST算法]

    2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem F ...

  5. UVA 11235 Frequent values(RMQ)

    Frequent values TimeLimit:3000Ms , ... , an in non-decreasing order. In addition to that, you are gi ...

  6. UVA 11235 Frequent values 线段树/RMQ

    vjudge 上题目链接:UVA 11235 *******************************************************大白书上解释**************** ...

  7. UVA 11235 Frequent Values ---RMQ

    大白书上的例题,具体讲解见大白书,最好用用一个Log数组直接求k,这样就是纯O(1)了 #include <iostream> #include <cstdio> #inclu ...

  8. POJ 3368 & UVA 11235 - Frequent values

    题目链接:http://poj.org/problem?id=3368 RMQ应用题. 解题思路参考:http://blog.csdn.net/libin56842/article/details/4 ...

  9. UVa 11235 Frequent values (RMQ && 区间出现最多次的数的次数)

    题意 : 给出一个长度为 n 的不降序序列,并且给出 q 个形如(L, R)的问询,问你这个区间出现的最多次的数的次数. 分析 : 很自然的想到将区间“缩小”,例如1 1 2 3 3 3就可以变成2 ...

随机推荐

  1. 结构体mem_pool_t

    /** Memory area header */ typedef struct mem_area_struct mem_area_t; /** Memory pool */ typedef stru ...

  2. open_table

    /* Open a table. SYNOPSIS open_table() thd Thread context. table_list Open first table in list. acti ...

  3. svn: E230001: Server SSL certificate verification failed

    TortoiseSvn是好的 命令行svn 的时候 有问题 ,也加了--no-auth-cache --non-interactive参数 svn list 地址 选下p 就好. http://sta ...

  4. bzoj4025

    首先我们要知道,怎么去维护一个是否是二分图 二分图的充要条件:点数>=2且无奇环 重点就是不存在奇环,怎么做呢 考虑随便维护一个图的生成树,不难发现,如果一条边加入后,形成奇环的话就不是二分图 ...

  5. Repeater 控件 当数据源没有数据的时候显示 暂无数据 的两种方式

    第一种:现在前台给Repeater控件外面的div加一个runat=”server”  然后在cs后台判断数据源是否为空, 是的话就修改这个前台div的InnerText或者是InnerHtml 即可 ...

  6. hdu 5310 Souvenir (水)

    题意:今天是BestCoder一周年纪念日. 比赛管理员Soda想要给每个参赛者准备一个纪念品. 商店里纪念品的单价是p元, 同时也可以花q元购买纪念品套装, 一个套装里有m个纪念品.今天总共有n个参 ...

  7. LeetCode Reverse Linked List (反置链表)

    题意: 将单恋表反转. 思路: 两种方法:迭代和递归. 递归 /** * Definition for singly-linked list. * struct ListNode { * int va ...

  8. Java [Leetcode 198]House Robber

    题目描述: You are a professional robber planning to rob houses along a street. Each house has a certain ...

  9. MPI编程的常用接口速查

    获取当前时间 在插入MPI提供的头文件后,可以获得获取时间的函数. double MPI_Wtime(void) 取得当前时间, 计时的精度由 double MPI_Wtick(void) 取得作为对 ...

  10. Delphi 自带的那个 Hand 光标很难看?没关系,一行代码解决问题:

    Delphi 自带的那个 Hand 光标很难看?没关系,一行代码解决问题: Screen.Cursors[crHandPoint] := LoadCursor(0, IDC_HAND);放在主窗体 O ...