Title

USACO_2007_Jan_S_Balanced_Lineup

USACO_2007_Jan_S_Balanced_Lineup

思路

区间最大最小值

\(st\)表板子题

代码

神奇的代码
int n = 0;
int mx[maxn][32];
int mn[maxn][32];
int nums[maxn];

// ans[i][j] [i, i + 2 ^ j - 1]的最值

void st_mx()
{

    for (int i = 1; i <= n; i++)
    {
        mx[i][0] = nums[i];
    }
    int t = log2(n);
    for (int j = 1; j <= t; j++)
    {
        int m = n + 1 - (1 << j);
        for (int i = 1; i <= m; i++)
        {
            mx[i][j] = std::max(mx[i][j - 1], mx[i + (1 << (j - 1))][j - 1]);
        }
    }
}


void st_mn()
{
    for (int i = 1; i <= n; i++)
    {
        mn[i][0] = nums[i];
    }
    int t = log2(n);
    for (int j = 1; j <= t; j++)
    {
        int m = n + 1 - (1 << j);
        for (int i = 1; i <= m; i++)
        {
            mn[i][j] = std::min(mn[i][j - 1], mn[i + (1 << (j - 1))][j - 1]);
        }
    }
}

int query_mx(int l, int r)
{
    int t = log2(r - l + 1);
    return std::max(mx[l][t], mx[r + 1 - (1 << t)][t]);
}

int query_mn(int l, int r)
{
    int t = log2(r - l + 1);
    return std::min(mn[l][t], mn[r + 1 - (1 << t)][t]);
}

void solve()
{
    int q = 0;
    std::cin >> n >> q;
    for (int i = 1; i <= n; i++)
    {
        std::cin >> nums[i];
    }
    st_mn();
    st_mx();
    int l = 0, r = 0;
    for (int i = 1; i <= q; i++)
    {
        std::cin >> l >> r;
        std::cout << query_mx(l, r) - query_mn(l, r) << endl;
    }
}

posted @ 2024-11-06 23:38  栗悟饭与龟功気波  阅读(15)  评论(0)    收藏  举报