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,如需转载请自行联系原作者

相关文章
|
5月前
|
算法
"刷题记录:哈希表+双指针 | leetcode-2465. 不同的平均值数目 "
该文段是一篇关于编程题目的解答,主要讨论如何找到数组中所有不同平均值的个数。作者首先使用排序和哈希集来解决,将数组转为列表排序后,通过双指针计算平均值并存入哈希集以去重。然后,作者发现可以优化方案,通过双指针在排序后的数组中直接计算两数之和,用哈希集记录不重复的和,从而避免实际计算平均值,提高了算法效率。最终代码展示了这两种方法。
44 0
|
5月前
滑动窗口最大值(leetcode hot100)
滑动窗口最大值(leetcode hot100)
|
5月前
|
C++
数的三次方根(二分查找的应用)
数的三次方根(二分查找的应用)
|
5月前
|
存储 算法
《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数
《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数
|
5月前
|
算法 测试技术 C#
二分查找|前缀和|滑动窗口|2302:统计得分小于 K 的子数组数目
二分查找|前缀和|滑动窗口|2302:统计得分小于 K 的子数组数目
|
12月前
|
算法
poj 1961 Period(kmp最短循环节)
给定一个长度为n的字符串s,求他每个前缀的最短循环节。换句话说,对于每个i(2<=i<=n),求一个最大的整数k(如果k存在),使得s的前i个字符可以组成的前缀是某个字符串重复k次得到的。输出所有存在K的i和对应的k。
39 0
|
机器学习/深度学习 人工智能 算法
CF1446D Frequency Problem(思维 前缀和 根号分治 双指针)
CF1446D Frequency Problem(思维 前缀和 根号分治 双指针)
85 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.
140 0
[POJ] John‘s trip | 欧拉回路 | 边序列字典序最小 + 建图
|
Go
[Nowcoder / POJ2728] 最优比率生成树 | 二分 + prim
有n个点,其中,每个点给出位置坐标( x , y ) 以及高度z ,两点之间的距离为两点之间的欧几里得距离 两点之间建立一条路的代价为两点之间的高度差,问将n 个点联通的情况下,求出最大的cost/dis
125 0