UVa 11235 Frequent values 【RMQ】

#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define sec second
int n, m;
const int MAX = 1e5 + 7;
const int INF = 0x3f3f3f3f;
pair <int, int> P[MAX];
int bor[MAX];
int col[MAX];
int a[MAX];
int dmx[MAX][20];
void RMQ(int cnt)
{
    for(int i = 1; i <= cnt; i++)
        dmx[i][0] = P[i].sec;
    for(int j = 1; (1 << j) <= cnt; j++)
        for(int i = 1; i + (1 << j) - 1 <= cnt; i++)
            dmx[i][j] = max(dmx[i][j - 1], dmx[i + (1 << (j - 1))][j - 1]);
}
int Query(int l, int r)
{
    if(r - l + 1 <= 0)
        return 0;
    int k = 0;
    while(1 << (k + 1) <= r - l + 1)
        k++;
    return max(dmx[l][k], dmx[r - (1 << k) + 1][k]);
}
int solve(int l, int r)
{
    int L = col[l], R = col[r];
    if(L == R)
        return r - l + 1;
    return max(bor[L] - l + 1, max(r - bor[R - 1], Query(L + 1, R - 1)));
}
int main()
{
    ios::sync_with_stdio(false);
    while(cin >> n && n){
        cin >> m;
        a[0] = INF;
        int cnt = 0;
        for(int i = 1; i <= n; i++){
            cin >> a[i];
            if(a[i] != a[i - 1]){
                P[++cnt] = mp(a[i], 1);
                bor[cnt] = bor[cnt - 1] + 1;
            }
            else{
                P[cnt].sec++;
                bor[cnt]++;
            }
            col[i] = cnt;
        }
        RMQ(cnt);
        int l, r;
        while(m--){
            cin >> l >> r;
            cout << solve(l, r) << endl;
        }
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/head_hard/article/details/80501730