UVA 11235 Frequent values RMQ

来源:互联网 发布:mac子弹头rebel 编辑:程序博客网 时间:2024/05/17 08:31
Frequent values
Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu

[Submit]   [Go Back]   [Status]  

Description

Download as PDF
2007/2008 ACM International Collegiate Programming Contest 
University of Ulm Local Contest

Problem F: Frequent values

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 indicesi and j (1 ≤ i ≤ j ≤ n). For each query, determine the most frequent value among the integers ai , ... , aj.

Input Specification

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 nintegers 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 Specification

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

A naive algorithm may not run in time!

Source

Root :: Competitive Programming: Increasing the Lower Bound of Programming Contests (Steven & Felix Halim) :: Chapter 2. Data Structures and Libraries :: Data Structures With Our-Own Libraries :: Segment Tree
Root :: Competitive Programming 3: The New Lower Bound of Programming Contests (Steven & Felix Halim) :: Data Structures and Libraries :: Data Structures with Our-Own Libraries :: Tree-related Data Structures

Root :: AOAPC I: Beginning Algorithm Contests -- Training Guide (Rujia Liu) :: Chapter 3. Data Structures :: Maintaining Interval Data :: Examples
Root :: Competitive Programming 2: This increases the lower bound of Programming Contests. Again (Steven & Felix Halim) :: Data Structures and Libraries :: Data Structures with Our-Own Libraries :: Tree-related Data Structures

[Submit]   [Go Back]   [Status]  

#include <cstdlib>#include <cctype>#include <cstring>#include <cstdio>#include <cmath>#include <algorithm>#include <vector>#include <string>#include <iostream>#include <map>#include <set>#include <queue>#include <stack>#include <bitset>using namespace std;#define PB push_back#define MP make_pair#define REP(i,n) for(int i=0;i<(n);++i)#define FOR(i,l,h) for(int i=(l);i<=(h);++i)#define DWN(i,h,l) for(int i=(h);i>=(l);--i)#define CLR(vis,pos) memset(vis,pos,sizeof(vis))#define PI acos(-1.0)#define INF 0x3f3f3f3f#define LINF 1000000000000000000LL#define eps 1e-8typedef long long ll;const int maxn=100000+100;int n,q;int a[maxn];int val[maxn],num[maxn];int g;int id[maxn],Left[maxn],Right[maxn];int d[maxn][20];void RMQ_init(int A[],int n){    FOR(i,1,n) d[i][0]=A[i];    for(int j=1;(1<<j)<=n;j++)        for(int i=1;i+(1<<j)-1<=n;i++)          d[i][j]=max(d[i][j-1],d[i+ (1<<(j-1))][j-1]);}int RMQ(int L,int R){    int k=0;    while((1<<(k+1))<=R-L+1) k++;    return max(d[L][k],d[R-(1<<k)+1][k]);}int main(){    while(cin>>n && n){        scanf("%d",&q);        g=0;        val[0]=INF;        FOR(i,1,n){            scanf("%d",&a[i]);            if(a[i]!=val[g]){                g++;                val[g]=a[i];                num[g]=1;                id[i]=g,Left[g]=i,Right[g-1]=i-1;            }            else{                num[g]++;                id[i]=g;            }        }        Right[g]=n;        /*FOR(i,1,g){            printf("%d %d %d %d\n",val[i],num[i],Left[i],Right[i]);        }*/        RMQ_init(num,g);        int l,r;        REP(i,q){            scanf("%d%d",&l,&r);            int l_id=id[l];            int r_id=id[r];            //printf("%d %d\n",l_id,r_id);            if(l_id==r_id){                printf("%d\n",r-l+1);            }            else{                int ans=-INF;                ans=max(Right[l_id]-l+1,r-Left[r_id]+1);                if(r_id-1>=l_id+1)                 ans=max(ans,RMQ(l_id+1,r_id-1));                printf("%d\n",ans);            }        }    }    return 0;}


0 0
原创粉丝点击