HDU-1806 Frequent values (RMQ, 最大连续值区间)

                                                                                                           

题意: 给你一个1-N的区间 有q次询问 每次询问一个l-r区间的 最大相等连续区间长度
思路: RMQ 也可以用线段树做 
AC 代码:
 
#include
#include
#include
#include
#include
#include
using namespace std;
#define INF 1e9+5
#define N 100010
int dp[N][30], a[N];
int main()
{
    int n, m, i, k;
    while (scanf("%d", &n) != EOF)
    {
        if (n == 0)
            break; // 0就跳出
        memset(dp, 0, sizeof(dp));
        //每次运行清空数组 scanf("%d", &m);
        for (i = 1; i <= n; i++)
        {
            scanf("%d", &a[i]);
            if (i == 1)
                dp[i][0] = 1; //第一个
            else
            {
                if (a[i] == a[i - 1])
                    dp[i][0] = dp[i - 1][0] + 1;
                //记录每个连续区间的长度 else
                {
                    dp[i][0] = 1;
                    //不连续初始化1
                }
            }
        }
        for (k = 1; (1 << k) <= n; k++)
        {
            for (i = 1; i + (1 << k - 1) <= n; i++)
            {
                dp[i][k] = max(dp[i][k - 1], dp[i + (1 << k - 1)][k - 1]);
                //求最大值连续
            }
        }
        for (i = 0; i < m; i++)
        {
            int l, r;
            scanf("%d%d", &l, &r);
            if (l <= r) //输入放入l r 未说r>=l 所以有个小坑
            {
                int t = l;
                while (a[t] == a[t - 1] && t <= r)
                    //若a[l]不是1 使求和的最大值为和a[t]粘连的区间的连续最大值
                {
                    t++;
                }
                int ans;
                if (t <= r) //判断转移后的t是否在区间内
                {
                    k = log2(r - t + 1);
                    ans = max(dp[t][k], dp[r - (1 << k) + 1][k]);
                    //t-r 区间内 最大连续
                    ans = max(ans, t - l); //比较两者的最大值 取最大
                }
                else
                {
                    ans = t - l;
                }
                printf("%d\n", ans);
            }
            else
            {
                printf("0\n");
            }
        }
    }
    return 0;
}

 

你可能感兴趣的:(HDU-1806 Frequent values (RMQ, 最大连续值区间))