POJ 3264-Balanced Lineup(段树:单点更新,间隔查询)

简介:
Balanced Lineup
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 34522   Accepted: 16224
Case Time Limit: 2000MS

Description

For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a contiguous range of cows from the milking lineup to play the game. However, for all the cows to have fun they should not differ too much in height.

Farmer John has made a list of Q (1 ≤ Q ≤ 200,000) potential groups of cows and their heights (1 ≤ height ≤ 1,000,000). For each group, he wants your help to determine the difference in height between the shortest and the tallest cow in the group.

Input

Line 1: Two space-separated integers,  N and  Q
Lines 2.. N+1: Line  i+1 contains a single integer that is the height of cow  i 
Lines  N+2.. N+ Q+1: Two integers  A and  B (1 ≤  A ≤  B ≤  N), representing the range of cows from  A to  B inclusive.

Output

Lines 1.. Q: Each line contains a single integer that is a response to a reply and indicates the difference in height between the tallest and shortest cow in the range.

Sample Input

6 3
1
7
3
4
2
5
1 5
4 6
2 2

Sample Output

6
3
0

Source

经ysj一说我也准备噜线段树了 那天下午他来给我讲了一下线段树。先敲个模板再说。。

题意是找某个区间的最大值和最小值的差值。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <list>
#define LL long long
using namespace std;
const int INF=1<<27;
const int maxn=200010;
LL minn[maxn],maxx[maxn];
void update(LL root,LL l,LL r,LL p,LL v)//单点更新
{
	if(l==r) maxx[root]=v;minn[root]=v;
	if(l<r)
	{
		LL mid=(l+r)/2;
		if(p<=mid) update(root*2,l,mid,p,v);
		else update(root*2+1,mid+1,r,p,v);
		maxx[root]=max(maxx[root*2],maxx[root*2+1]);
		minn[root]=min(minn[root*2],minn[root*2+1]);
	}
}
LL query_min(LL root,LL l,LL r,LL ql,LL qr)
{
	LL mid=(l+r)/2,ans=INF;
	if(ql<=l&&qr>=r) return minn[root];
	if(ql<=mid) ans=min(ans,query_min(root*2,l,mid,ql,qr));
	if(qr>mid) ans=min(ans,query_min(root*2+1,mid+1,r,ql,qr));
	return ans;
}
LL query_max(LL root,LL l,LL r,LL ql,LL qr)
{
	LL mid=(l+r)/2,ans=-INF;
	if(ql<=l&&qr>=r) return maxx[root];
	if(ql<=mid) ans=max(ans,query_max(root*2,l,mid,ql,qr));
	if(qr>mid) ans=max(ans,query_max(root*2+1,mid+1,r,ql,qr));
	return ans;
}
int main()
{
  int N,Q,i,v;
  while(~scanf("%lld%lld",&N,&Q))
  {
  	for(i=1;i<=N;i++)
	{
		scanf("%lld",&v);
		update(1,1,N,i,v);
	}
	while(Q--)
	{
		int ql,qr;
		scanf("%lld%lld",&ql,&qr);
		printf("%lld\n",query_max(1,1,N,ql,qr)-query_min(1,1,N,ql,qr));
	}
  }
  return 0;
}








本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5041618.html,如需转载请自行联系原作者

相关文章
|
7月前
【每日一题Day141】LC2379得到 K 个黑块的最少涂色次数 | 滑动窗口
【每日一题Day141】LC2379得到 K 个黑块的最少涂色次数 | 滑动窗口
41 0
|
7月前
|
人工智能 BI
【每日一题Day354】LC2316统计无向图中无法互相到达点对数 | 并查集
【每日一题Day354】LC2316统计无向图中无法互相到达点对数 | 并查集
54 0
|
7月前
|
存储
【每日一题Day307】LC56合并区间 | 排序
【每日一题Day307】LC56合并区间 | 排序
42 0
|
算法
poj 1961 Period(kmp最短循环节)
给定一个长度为n的字符串s,求他每个前缀的最短循环节。换句话说,对于每个i(2<=i<=n),求一个最大的整数k(如果k存在),使得s的前i个字符可以组成的前缀是某个字符串重复k次得到的。输出所有存在K的i和对应的k。
47 0
|
机器学习/深度学习 人工智能 算法
CF1446D Frequency Problem(思维 前缀和 根号分治 双指针)
CF1446D Frequency Problem(思维 前缀和 根号分治 双指针)
93 0
|
机器学习/深度学习
[POJ] John‘s trip | 欧拉回路 | 边序列字典序最小 + 建图
Description Little Johnny has got a new car. He decided to drive around the town to visit his friends. Johnny wanted to visit all his friends, but there was many of them. In each street he had one friend. He started thinking how to make his trip as short as possible.
144 0
[POJ] John‘s trip | 欧拉回路 | 边序列字典序最小 + 建图
|
Go
[Nowcoder / POJ2728] 最优比率生成树 | 二分 + prim
有n个点,其中,每个点给出位置坐标( x , y ) 以及高度z ,两点之间的距离为两点之间的欧几里得距离 两点之间建立一条路的代价为两点之间的高度差,问将n 个点联通的情况下,求出最大的cost/dis
131 0
HDOJ/HDU 2566 统计硬币(公式~遍历~)
HDOJ/HDU 2566 统计硬币(公式~遍历~)
146 0