• Frequent values POJ


    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
    ------------------------详解请看http://blog.sina.com.cn/s/blog_6635898a0100kzpx.html
     1 #include<cmath>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 #define INF 1e8
     7 #define lson l , m , rt << 1
     8 #define rson m+1,r,  rt << 1 | 1
     9 using namespace std;
    10 
    11 const int maxn=100050;
    12 
    13 struct mnode{ int l,r,max; }node[4*maxn];
    14 struct mnseg{ int sta,end; }seg[maxn]; 
    15 
    16 int n,q;
    17 int num[maxn],hash[maxn];
    18 
    19 void Inite(){                                        //将序列处理成点的集合
    20     for(int i=1;i<=n;i++) scanf("%d",&num[i]);
    21     int k=0,pre=999999;
    22     for(int i=1;i<=n;i++){
    23         if(num[i]!=pre){
    24             pre=num[i];
    25             k++;
    26             seg[k].sta=i;
    27             seg[k].end=i;
    28         }
    29         else seg[k].end=i;
    30         hash[i]=k;
    31     } 
    32 }
    33 
    34 void Build(int l,int r,int rt){
    35     node[rt].l=l;
    36     node[rt].r=r;
    37     if(l==r){ node[rt].max=seg[l].end-seg[l].sta+1; return; }
    38     int m=(l+r)>>1;
    39     Build(lson);
    40     Build(rson);
    41     node[rt].max=max(node[rt<<1].max,node[(rt<<1)|1].max); 
    42 }
    43 
    44 int Query(int l,int r,int rt){                                //key point!!!!
    45     if(node[rt].l==l&&node[rt].r==r) return node[rt].max;
    46     if(r<=node[rt<<1].r) return Query(l,r,rt<<1);
    47     if(l>=node[(rt<<1)|1].l) return Query(l,r,(rt<<1)|1);
    48     int a=Query(l,node[rt<<1].r,rt<<1);
    49     int b=Query(node[(rt<<1)|1].l,r,(rt<<1)|1);
    50     return max(a,b);
    51 }
    52 
    53 int main()
    54 {   while(~scanf("%d",&n)){
    55         if(n==0) break;
    56         scanf("%d",&q);
    57         
    58         Inite();
    59         Build(1,n,1);
    60         while(q--){
    61             int a,b,pos1,pos2;
    62             scanf("%d%d",&a,&b);
    63             pos1=hash[a],pos2=hash[b];
    64             if(pos1==pos2) cout<<b-a+1<<endl;
    65             else{
    66                 int n1,n2,n3;
    67                 n1=seg[pos1].end-a+1;
    68                 n2=0;
    69                 n3=b-seg[pos2].sta+1;
    70                 if(pos2-pos1>1) n2=Query(pos1+1,pos2-1,1);
    71                 cout<<max(n1,max(n2,n3))<<endl;
    72             }
    73         }
    74     }
    75     return 0;
    76 }
  • 相关阅读:
    Go语言基础--1.1 变量的声明
    基本语法
    弹性盒子修改
    弹性盒子内容
    弹性盒子
    响应式列重置
    栅格系统
    布局容器
    额外按钮
    可消失的弹出框
  • 原文地址:https://www.cnblogs.com/zgglj-com/p/7366811.html
Copyright © 2020-2023  润新知