#188-[RMQ]Balanced Lineup

版权声明:反正也没有人会转,下一个 https://blog.csdn.net/drtlstf/article/details/85011353

Description

对于每天的挤奶,Farmer John的N头奶牛(1≤ N ≤50,000)总是以相同的顺序排队。有一天,农夫约翰决定与一些奶牛组织一场终极飞盘游戏。为了使事情变得简单,他将从奶牛阵容中接过一些的奶牛来玩游戏。然而,为了让所有的牛都玩得开心,它们的高度不应该有太大差异。农夫约翰已经量了所有奶牛的高度(1≤ 高度 ≤1,000,000)并把它们分为Q个(1≤ Q ≤200,000)奶牛组。对于每个组,他希望得到你的帮助来确定组中最矮和最高的牛之间的高度之差。 


 

Input

第一行:两个空间分开的整数,N和Q。 
线2 .. N+ 1行:包含一个单一的整数,第i头牛的高度
线N+2 …N + Q+ 1:两个整数A和B(1≤ A ≤ B ≤N),代表从A到B这个范围的牛。

Output

每行包含单个整数,表示每组内最高和最矮母牛之间的高度差。

6 3
1
7
3
4
2
5
1 5
4 6
2 2
  • Sample Input

6
3
0
  • Sample Output

  • RMQ模板?

  • #include <iostream>
    #include <cmath>
    
    #define SIZE 50010
    #define NUM 30
    
    using namespace std;
    
    int maxdp[SIZE][NUM], mindp[SIZE][NUM]; // 最大值,最小值
    
    int main(void)
    {
    	int n, m, x, y, i, j, h;
    	
    	scanf("%d%d", &n, &m);
    	for (i = 1; i <= n; ++i)
    	{
    		scanf("%d", &x);
    		maxdp[i][0] = mindp[i][0] = x;
    	}
    	for (j = 1; (1 << j) <= n; ++j) // 开始位置
    	{
    		for (i = 1; i + (1 << j) - 1 <= n; ++i) // 区间长度是2^j
    		{
    			maxdp[i][j] = max(maxdp[i][j-1], maxdp[i+(1<<(j-1))][j-1]); // 开始动归
    			mindp[i][j] = min(mindp[i][j-1], mindp[i+(1<<(j-1))][j-1]);
    		}
    	}
    	while (m--)
    	{
    		scanf("%d%d", &x, &y);
    		h = log(y - x + 1) / log(2);
    		printf("%d\n", max(maxdp[x][h], maxdp[y-(1<<h)+1][h]) - min(mindp[x][h], mindp[y-(1<<h)+1][h])); // 区间分成两段,查询
    	}
    	
    	return 0;
    }

猜你喜欢

转载自blog.csdn.net/drtlstf/article/details/85011353