• POJ 3264 Balanced Lineup (RMQ问题)


    最简单的RMQ问题,这次改用ST算法来写,存下来当模板吧。

    ST算法通过nlogn的时间(也可以是O(n))预处理出d[i][j](起始位置为i长度为2^(j-1))区间的内的最值,递推式:d[i][j] = min(d[i][j-1],d[I+2^(j-1][j-1])

    查询的时候先找到一个k有2^(k+1)>(R-L+1)然后可得minv(L,R)=min(d[L][K],d[R-(1<<K)+1][k])中间有些元素可能重复判断了,不过求最值问题不需要考虑这些。

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn = 50001;
    int minv[maxn][20],maxv[maxn][20],n,val[maxn],q;
    void init_RMQ() {
    	for (int i = 0; i < n; i++) minv[i][0] = maxv[i][0] = val[i];
    	for (int j = 1; (1 << j) <= n; j++) {
    		for (int i = 0; i + (1 << j) < n + 1; i++) {
    			maxv[i][j] = max(maxv[i][j - 1], maxv[i + (1 << (j - 1))][j - 1]);
    			minv[i][j] = min(minv[i][j - 1], minv[i + (1 << (j - 1))][j - 1]);
    		}
    	}
    }
    int main() {
    	scanf("%d%d", &n, &q);
    	for (int i = 0; i < n; i++) scanf("%d", val + i);
    	init_RMQ();
    	int a, b;
    	for (int i = 0; i < q; i++) {
    		scanf("%d%d", &a, &b); a--; b--;
    		int k = 0;
    		while ((1 << (k + 1)) <= b - a + 1) k++;
    		printf("%d
    ", max(maxv[a][k], maxv[b - (1 << k) + 1][k]) - min(minv[a][k], minv[b - (1 << k) + 1][k]));
    	}
    	return 0;
    }
  • 相关阅读:
    noip2007 tg day1t1 统计数字
    洛谷1123 取数游戏
    洛谷1123 取数游戏
    素数筛
    bzoj 1297 [SCOI2009]迷路
    bzoj 2115 [Wc2011] Xor——路径和环的转化
    poj 2154 Color——带优化的置换
    bzoj 1407 [Noi2002]Savage
    poj 1286 Necklace of Beads
    bzoj 4031 [HEOI2015]小Z的房间
  • 原文地址:https://www.cnblogs.com/rolight/p/3530053.html
Copyright © 2020-2023  润新知