zoukankan      html  css  js  c++  java
  • POJ 3368 Frequent values (RMQ)

    Frequent values
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 11540   Accepted: 4206

    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 10
    2 3
    1 10
    5 10
    0

    Sample Output

    1
    4
    3

    Source

     
     
     
     
     

    这题需要一个区间内,出现次数最多的数出现的次数。

    先离散化处理下,然后转化成RMQ问题。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <algorithm>
     4 #include <iostream>
     5 using namespace std;
     6 
     7 const int MAXN = 100010;
     8 
     9 int dp[MAXN][20];
    10 int mm[MAXN];
    11 
    12 void initRMQ(int n,int b[])
    13 {
    14     mm[0] = -1;
    15     for(int i = 1;i <= n;i++)
    16     {
    17         mm[i] = ((i&(i-1)) == 0)?mm[i-1]+1:mm[i-1];
    18         dp[i][0] = b[i];
    19     }
    20     for(int j = 1;j <= mm[n];j++)
    21         for(int i = 1;i + (1<<j) - 1 <= n;i++)
    22             dp[i][j] = max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
    23 }
    24 int rmq(int x,int y)
    25 {
    26     int k = mm[y-x+1];
    27     return max(dp[x][k],dp[y-(1<<k)+1][k]);
    28 }
    29 
    30 int a[MAXN];
    31 int hash[MAXN];
    32 int L[MAXN],R[MAXN];
    33 int b[MAXN];
    34 
    35 int main()
    36 {
    37     int n,m;
    38     while(scanf("%d",&n) == 1 && n)
    39     {
    40         scanf("%d",&m);
    41         for(int i = 1;i <= n;i++)
    42             scanf("%d",&a[i]);
    43         int k = 1;
    44         int l = 1;
    45         memset(b,0,sizeof(b));
    46         for(int i = 1;i <= n;i++)
    47         {
    48             if(i > 1 && a[i] != a[i-1])
    49             {
    50                 for(int j = l;j < i;j++)
    51                 {
    52                     L[j] = l;
    53                     R[j] = i-1;
    54                 }
    55                 b[k] = i - l;
    56                 l = i;
    57                 k ++;
    58             }
    59             hash[i] = k;
    60         }
    61         for(int j = l;j <= n;j++)
    62         {
    63             L[j] = l;
    64             R[j] = n;
    65         }
    66         b[k] = n-l+1;
    67         initRMQ(k,b);
    68 
    69         int u,v;
    70         while(m--)
    71         {
    72             scanf("%d%d",&u,&v);
    73             int t1 = hash[u];
    74             int t2 = hash[v];
    75             if(t1 == t2)
    76             {
    77                 printf("%d
    ",v-u+1);
    78                 continue;
    79             }
    80             int ans = max(R[u]-u+1,v-L[v]+1);
    81             t1++;
    82             t2--;
    83             if(t1 <= t2)ans = max(ans,rmq(t1,t2));
    84             printf("%d
    ",ans);
    85         }
    86     }
    87     return 0;
    88 }
  • 相关阅读:
    Leetcode 18. 4Sum
    Leetcode 15. 3Sum
    Leetcode 16. 3Sum Closest
    String类型的理解
    求字符串中某个字符出现的次数
    用StringBuilder来实现经典的反转问题
    String/StringBuilder 类 用对象数组实现登录注册功能
    String/StringBuilder 类 统计字符串中字符出现的次数
    String/StringBuilder 类 判断QQ号码
    C++ 面向对象: I/O对象的应用
  • 原文地址:https://www.cnblogs.com/kuangbin/p/3226875.html
Copyright © 2011-2022 走看看