zoukankan      html  css  js  c++  java
  • poj 3368 Frequent values rmq

    题意:给你一串数列,然后给你一个起终位置对,问你这个段序列里出现最多的出现了几次。

    思路:一段序列里,无非就是三种情况,1,一组相同的数,2两组相同,3,3组或者更多组数,这样我们队每一组数的开头结束位置记录一下,然后对每次询问判断一下几组数,分别讨论,多组的就分为第一组,最后一组,中间多组,中间直接rmq就可以了。

    代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include <stdlib.h>
     6 #include <vector>
     7 #include <queue>
     8 #include <stack>
     9 #define loop(s,i,n) for(i = s;i < n;i++)
    10 #define cl(a,b) memset(a,b,sizeof(a))
    11 int num[100005],b[100005],rt[100005],lt[100005],a[100005],maxd[100005][17];
    12 using namespace std;
    13 void init(int n)
    14 {
    15     int i,j;
    16     for(i = 1;i <= n;i++)
    17     maxd[i][0] = a[i];
    18 
    19     for(j = 1;(1<<j) <= n;j++)
    20     {
    21         for(i = 1;i+(1<<j)-1<=n;i++)
    22         {
    23             maxd[i][j] = max(maxd[i][j-1],maxd[i+(1<<(j-1))][j-1]);
    24         }
    25     }
    26 }
    27 int maxrmq(int l,int r)
    28 {
    29     int k = 0;
    30     while(1<<(k+1) <= r-l+1)k++;
    31     return max(maxd[l][k],maxd[r-(1<<k)+1][k]);
    32 
    33 }
    34 int main()
    35 {
    36     int n,q;
    37 
    38     while(scanf("%d",&n)&&n)
    39     {
    40         int i,j;
    41         scanf("%d",&q);
    42         loop(1,i,n+1)
    43         {
    44             scanf("%d",&b[i]);
    45         }
    46         int cnt,leap;
    47         cnt = 1;
    48         leap = b[1];
    49         for(i = 0;i <= n;i++)
    50         a[i] = num[i] = 0;
    51         lt[1] = 1;
    52         for(i = 1;i <= n;i++)
    53         {
    54             if(leap != b[i])
    55             rt[cnt] = i-1,cnt++,lt[cnt] = i,leap = b[i];
    56             num[i] = cnt;
    57             a[cnt]++;
    58         }
    59         rt[cnt] = n;
    60         init(cnt);
    61 
    62         while(q--)
    63         {
    64             int l,r,a,b,c;
    65             scanf("%d %d",&l,&r);
    66             if(num[l] == num[r])
    67             b = r-l+1;
    68             else if(num[r]-num[l] > 1)
    69             {
    70                 a = rt[num[l]]-l+1;
    71                 b = r-lt[num[r]]+1;
    72                 c = maxrmq(num[l]+1,num[r]-1);
    73                 b = max(a,b);
    74                 b = max(b,c);
    75             }
    76             else
    77             {
    78                 a = rt[num[l]]-l+1;
    79                 b = r-lt[num[r]]+1;
    80                 b = max(a,b);
    81             }
    82 
    83             printf("%d
    ",b);
    84         }
    85     }
    86     return 0;
    87 }
    View Code
  • 相关阅读:
    5.6Java 创建File
    5.6Java File ApI
    Java字符集乱码
    5.17Java文件的拷贝
    5.10Java实操IO流,面向接口编程,面向父类编程
    5.6Java File对象使用递归打印子孙级目录以及文件的名称
    5.10JavaIo流四大抽象类
    5.17Java文件字节流
    5.7通过Maven配置seleeniumjava依赖
    5.6Java多态的介绍
  • 原文地址:https://www.cnblogs.com/0803yijia/p/3296830.html
Copyright © 2011-2022 走看看