POJ 3368

来源:互联网 发布:美工助手阿里巴巴版 编辑:程序博客网 时间:2024/06/05 06:53

Frequent values
Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 17409 Accepted: 6287

Description

You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to that, you are given several queries consisting of indices i and j (1 ≤ i ≤ j ≤ n). For each query, determine the most frequent value among the integers ai , ... , aj.

Input

The input consists of several test cases. Each test case starts with a line containing two integers n and q (1 ≤ n, q ≤ 100000). The next line contains n integers a1 , ... , an (-100000 ≤ ai ≤ 100000, for each i ∈ {1, ..., n}) separated by spaces. You can assume that for each i ∈ {1, ..., n-1}: ai ≤ ai+1. The following q lines contain one query each, consisting of two integers i and j (1 ≤ i ≤ j ≤ n), which indicate the boundary indices for the 
query.

The last test case is followed by a line containing a single 0.

Output

For each query, print one line with one integer: The number of occurrences of the most frequent value within the given range.

Sample Input

10 3-1 -1 1 1 1 1 3 10 10 102 31 105 100

Sample Output

143

Source

Ulm Local 2007

一.题意分析

裸的ST表题目

二.思路过程

写一个构建ST表的函数和一个查询函数

三.代码

#include <iostream>#include <cstdio>#include <cmath>using namespace std;int num[100010], f[100010], MAX[100010][20];int n;void ST(){    int i, j, k;    for(i=1;i<=n;i++)        MAX[i][0]=f[i];    k=log((double)(n+1))/log(2.0);    for(j=1;j<=k;j++)        for(i=1;i+(1<<j)-1<=n;i++)            MAX[i][j]=max(MAX[i][j-1],MAX[i+(1<<(j-1))][j-1]);}int Query(int l,int r){    if(l>r)        return 0;    int k=log((double)(r-l+1))/log(2.0);    return max(MAX[l][k],MAX[r-(1<<k)+1][k]);}int main(){    int q,i,a,b;    while(scanf("%d",&n)&&n)    {        scanf("%d",&q);        for(i=1;i<=n;i++)        {            scanf("%d",&num[i]);            if(i==1)            {                f[i]=1;                continue;            }            if(num[i]==num[i-1])                f[i]=f[i-1]+1;            else                f[i]=1;        }        ST();        for(i=1;i<=q;i++)        {            scanf("%d%d",&a,&b);            int t=a;            while(t<=b&&num[t]==num[t-1])                t++;            int cnt=Query(t,b);            int ans=max(t-a,cnt);            printf("%d\n",ans);        }    }    return 0;}/*10 3-1 -1 1 1 1 1 3 10 10 102 31 105 100*/





0 0
原创粉丝点击