题意 : 给出一个长度为 n 的不降序序列,并且给出 q 个形如(L, R)的问询,问你这个区间出现的最多次的数的次数。

分析 : 很自然的想到将区间“缩小”,例如1 1 2 3 3 3就可以变成2 1 3,构造出“数量数组”,这个数组实际上就是已经将原来区间分了块,但是问询的区间不可能就是这些“数量数组”构成的"块",不过先来想想问询的区间可不可能包含这里面的某些"块"?很显然是有可能的,那么从这些"块"中找出最大值显然就是经典的RMQ问题,用ST可以预处理并解决,但是对于不是这些"块"的该怎么办呢?还是从这些"块"入手,首先先给这些"块"升序编号,对于这些"块"我们可以知道在原来区间当中其左右端点,比如1 1 2 3 3 3,我们可以分成① ② ③三块,值分别是2、1、3,第一块的左端点是原区间的1,右端点是2,同理第二块左右端点都是3,第三块左右端点是4和5,这样做便构成了“数量数组”下标和原数组下标的一个映射,对于问询(L, R)我们能够知道L属于那一块,那么这一个块在(L,R)这个区间内贡献的相同的值的元素个数就是=>L所在的块的右端点 - L + 1(这里记作val_L),对于R也是同理可以得到val_R,那么最后答案就是 ans = max( RMQ(L和R之间包含的完整的块), max(val_L, val_R))。不过需要注意的是,如果此时L R同在一个块中的话,那么答案就是R-L+1了!

#include<bits/stdc++.h>
using namespace std;
;
];
int cnt[maxn], L[maxn], R[maxn], num[maxn], tot;
inline void RMQ_init()
{
    ; i<tot; i++) dp[i][] = cnt[i];
    ; (<<j)<=tot; j++){
        ; i+(<<j)-<n; i++){
            dp[i][j] = max(dp[i][j-], dp[i+(<<(j-))][j-]);
        }
    }
}
int RMQ(int L, int R)
{
    ;
    ;
    <<(k+)) <= R-L+) k++;
    <<k)+][k]);
}
int main(void)
{
    while(~scanf("%d", &n) && n){
        scanf("%d", &q);
        memset(cnt, , sizeof(cnt));
        memset(L, , sizeof(L));
        memset(R, , sizeof(R));
        tot = ;///表示"块"的个数
        int Last;
        ; i<n; i++){///接下来对原区间的每一个元素进行映射处理
            scanf("%d", &arr[i]);
            ){
                Last = arr[i];///记录当前“块”的具体值
                L[tot] = i;///当前“块”的左端点是i
            }
            if(arr[i] == Last){///如果元素还是属于上一个“块”
                cnt[tot]++;///“块”里面的元素+1
                num[i] = tot;///当前下标i对应了tot这个块
                R[tot] = i;///更新右界
            }else{
                tot++;///有不同于之前的元素出现了,就相当于出现了新的“块”给其一个编号
                cnt[tot]++;///tot“块”内元素+1
                Last = arr[i];
                num[i] = tot;
                L[tot] = R[tot] = i;
            }
        }
        tot++;
        RMQ_init();///O(nlogn)的预处理
        while(q--){
            int Left, Right;
            scanf("%d %d", &Left, &Right);
            Left--, Right--;
            if(num[Left] == num[Right]){///如果同属一个“块”,则答案就是R - L + 1
                printf();
                continue;
            }else{
                , num[Right]-),
                          max(R[num[Left]]-Left+, Right-L[num[Right]]+));
                printf("%d\n", ans);
            }
        }

    }
    ;
}

UVa 11235 Frequent values (RMQ && 区间出现最多次的数的次数)的更多相关文章

  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 ---RMQ

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

  3. UVA 11235 Frequent values 线段树/RMQ

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

  4. UVA 11235 Frequent values(RMQ)

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

  5. UVA - 11235 Frequent values

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

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

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

  7. POJ 3368 & UVA 11235 - Frequent values

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

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

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

  9. poj 3368 Frequent values(RMQ)

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

随机推荐

  1. 【电子电路技术】短波红外InGaAs探测器简析

    核心提示: 红外线是波长介于微波与可见光之间的电磁波,波长在0.75-1000μm之间,其在军事.通讯.探测.医疗等方面有广泛的应用.目前对红外线的分类还没有统一的标准,各个专业根据应用的需要,有着自 ...

  2. CF486B OR in Matrix(构造+思维)

    CF486B 一道有趣的思维题 由于or的性质可知只要a[i][j]为1那么b中第i行,第j列将都变成1 相反的,如果b[i][j]是0那么a中第i行,第j列都必须是0 根据第二个性质我们可以构造出a ...

  3. 面试宝典:25个最经典的JavaScript面试题及答案

    1.使用 typeof bar === "object" 来确定 bar 是否是对象的潜在陷阱是什么?如何避免这个陷阱? 尽管 typeof bar === "objec ...

  4. 列出连通集(DFS及BFS遍历图) -- 数据结构

    题目: 7-1 列出连通集 (30 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递 ...

  5. 事件循环(EventLoop)的学习总结

    前言 在学习eventloop之前,我们需要复习一下js的单线程和异步.虽说js是单线程的,但是在浏览器和Node中都做了相应的处理.如浏览器中的web workers(工作线程),Node中的chi ...

  6. 服务器配置好但Idea/Datagrip无法连接远程数据库的解决方案

    服务器没有开放端口3306,在云服务控制台配置安全组即可.

  7. 2019icpc徐州网络赛

    A Who is better? 题意 excrt+斐波那契博弈 分析 Java的BigInteger对象默认为null,不能直接比较. 代码 import java.math.BigInteger; ...

  8. centos7 设置内核启动顺序

    1.查看设备上安装了几个内核 cat /boot/grub2/grub.cfg |grep menuentry 2.查看当前内核 grub2-editenv list saved_entry=Cent ...

  9. chrom插件1

    本文是稀土掘金投稿,虽然其中有倔金的私货,是篇推广文,但我看过后认为内容确实不错,有些好插件还是第一次知道,对我很有帮助,考虑过后还是决定推荐给大家,最近我比较关注各种提高开发效率的工具与技巧,今后看 ...

  10. [转载]一个支持Verilog的Vim插件——AutoDef

    原文地址:一个支持Verilog的Vim插件--AutoDef作者:hover 支持一下四种类型的变量声明: 1)时序always块中的寄存器变量reg 2)组合always块中的组合reg变量reg ...