初级线段树 POJ3264
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
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
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
线段树,也叫区间树(interval tree),它在各个节点保存一条线段(即子数组)。设数列A 包含
 N 个元素,则线段树的根节点表示整个区间A[1;N],左孩子表示区间A[1; (1 + N)/2],右孩子表
 示区间A[(1 + N)/2 + 1;N],不断递归,直到叶子节点,叶子节点只包含一个元素。
 线段树有如下特征:
 • 线段树是一棵完全二叉树
 • 线段树的深度不超过logL, L 是区间的长度
 • 线段树把一个长度为L 的区间分成不超过2 logL 条线段
 线段树的基本操作有构造线段树、区间查询和区间修改。
 线段树通常用于解决和区间统计有关的问题。比如某些数据可以按区间进行划分,按区间动态
 进行修改,而且还需要按区间多次进行查询,那么使用线段树可以达到较快的查询速度。
 用线段树解题,关键是要想清楚每个节点要存哪些信息(当然区间起点和终点,以及左右孩子
 指针是必须的���,以及这些信息如何高效查询,更新。不要一更新就更新到叶子节点,那样更新操作
 的效率最坏有可能O(N) 的。
用数组存储完全二叉树,可以使速度更快~
#include <iostream>
#include <vector>
#include <algorithm>
#include<map>
#include<vector>
#include<queue>
#include<string>
#include<set>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstring>
//#pragma warning(disable:4996)
using namespace std;
#define MAXN 50001
#define INF 0x7fffffff;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define L(a) ((a)<<1)
#define R(a) (((a)<<1)+1)
//数组存储线段树
typedef struct node_t {
	int left, right;
	int maxx, minx;
} node_t;
int a[MAXN];
node_t node[MAXN * 4];
int minx, maxx;
void init() {
	memset(node, 0, sizeof(node));
}
//以t为根节点,为区间l,r建立线段树
void build(int t, int l, int r) {
	node[t].left = l, node[t].right = r;
	if (l == r) {
		node[t].maxx = node[t].minx = a[l];
		return;
	}
	const int mid = (l + r) / 2;
	build(L(t), l, mid);
	build(R(t), mid + 1, r);
	node[t].maxx = max(node[L(t)].maxx, node[R(t)].maxx);
	node[t].minx = min(node[L(t)].minx, node[R(t)].minx);
}
void query(int t, int l, int r) {
	if (t > 200000) {
		minx = maxx = 0;
		return;
	}
	if (node[t].left == l&&node[t].right == r) {
		if (maxx < node[t].maxx)
			maxx = node[t].maxx;
		if (minx > node[t].minx)
			minx = node[t].minx;
		return;
	}
	const int mid = (node[t].left + node[t].right) / 2;
	if (l > mid) {
		query(R(t), l, r);
	}
	else if (r <= mid) {
		query(L(t), l, r);
	}
	else {
		query(L(t), l, mid);
		query(R(t), mid + 1, r);
	}
}
int main()
{
	//freopen("s.txt", "r", stdin);
	int n, q, i;
	scanf("%d%d", &n, &q);
	for (i = 1; i <= n; ++i) {
		scanf("%d", &a[i]);
	}
	init();
	build(1, 1, n);
	while (q--) {
		int a, b;
		scanf("%d%d", &a, &b);
		maxx = 0;
		minx = INF;
		query(1, a, b);
		printf("%d\n", maxx - minx);
	}
	return 0;
}
初级线段树 POJ3264的更多相关文章
- poj3264(简单线段树)
		题目链接:https://vjudge.net/problem/POJ-3264 题意:线段树简单应用题,区间查询最大值和最小值的差. 思路:用线段树维护区间的最大值和最小值即可. AC代码: #in ... 
- Balanced Lineup poj3264 线段树
		Balanced Lineup poj3264 线段树 题意 一串数,求出某个区间的最大值和最小值之间的差 解题思路 使用线段树,来维护最大值和最小值,使用两个查询函数,一个查区间最大值,一个查区间最 ... 
- 几道简单的线段树入门题 POJ3264&&POJ3468&&POJ2777
		Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 40687 Accepted: 19137 ... 
- [POJ3264]Balanced Lineup(线段树,区间最值差)
		题目链接:http://poj.org/problem?id=3264 一排牛按1~n标号记录重量,问每个区间最重的和最轻的差值. 线段树维护当前节点下属叶节点的两个最值,查询后作差即可. #incl ... 
- POJ3264——Balanced Lineup(线段树)
		本文出自:http://blog.csdn.net/svitter 题意:在1~200,000个数中.取一段区间.然后在区间中找出最大的数和最小的数字.求这两个数字的差. 分析:按区间取值,非常明显使 ... 
- poj3264(线段树区间求最值)
		题目连接:http://poj.org/problem?id=3264 题意:给定Q(1<=Q<=200000)个数A1,A2,```,AQ,多次求任一区间Ai-Aj中最大数和最小数的差. ... 
- POJ3264(线段树求区间最大最小值)
		Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 41162 Accepted: 19327 ... 
- kuangbin专题七 POJ3264 Balanced Lineup  (线段树最大最小)
		For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One d ... 
- POJ-3264 Balanced Lineup(区间最值,线段树,RMQ)
		http://poj.org/problem?id=3264 Time Limit: 5000MS Memory Limit: 65536K Description For the daily ... 
- 【ACM/ICPC2013】线段树题目集合(一)
		前言:前一段时间在网上找了一个线段树题目列表,我顺着做了一些,今天我把做过的整理一下.感觉自己对线段树了解的还不是很深,自己的算法能力还要加强.光练代码能力还是不够的,要多思考.向队友学习,向大牛学习 ... 
随机推荐
- STM32H5移植zbar记录
			ZBar是一种流行的二维码扫描和解码工具,它在嵌入式系统中拥有广泛的应用.在嵌入式系统中,我们面临着有限的资源和更严格的性能要求,因此,选择适当的库来完成特定的任务非常重要. ZBar适用于各种嵌入式 ... 
- K8s Pod状态与容器探针
			1.pod的调度流程及常见状态 1.1.pod的调度流程 Pod创建过程如上图所示,首先用户向apiserver发送创建pod的请求,apiserver收到用于创建pod请求后,对应会对该用户身份信息 ... 
- ORM核心功能之导航属性- EFCore和 SqlSugar
			导航属性 导航属性是作为ORM核心功能中的核心,在SqlSugar没有支持导航属性前,都说只是一个高级DbHelper, 经过3年的SqlSugar重构已经拥有了一套 非常成熟的导航属性体系,本文不是 ... 
- The shell
			The shell shell是什么? 如今的计算机有着多种多样的交互接口让我们可以进行指令的的输入,从炫酷的图像用户界面(GUI),语音输入甚至是 AR/VR 都已经无处不在. 这些交互接口可以覆盖 ... 
- vue 自己实现一套 keepalive 方案
			vue自定义keepalive组件 前一阵来了一个新的需求,要在vue项目中实现一个多开tab页面的功能,本来心想,这不简单嘛就是一个增加按钮重定向吗?(当然如果这么简单我就不写这个文章了).很快写完 ... 
- WPF中登录接口
			通过获取文本将json字符串转化成对象并做好相应的匹配 步骤 获取相应的文本 json字符串转化对象 json转化成实体类 参考链接:https://www.sojson.com/json2cshar ... 
- 解密Prompt系列8. 无需训练让LLM支持超长输入:知识库 & unlimiformer & PCW & NBCE
			这一章我们聊聊有哪些方案可以不用微调直接让大模型支持超长文本输入,注意这里主要针对无限输入场景.之前在BERT系列中我们就介绍过稀疏注意力和片段递归的一些长文本建模方案长文本建模 BigBird &a ... 
- docker-compose多服务器部署ELK
			多服务器构建ELK es使用1主2从,logstash转发,kibana展现,本文ELK版本使用7.16.1 如果单机测试,请查看docker-compose单服务器部署ELK es-master:1 ... 
- 在linux上启动arthas报“Can not find java process”
			发生背景 完整报错信息: [***@localhost ~]$ java -jar arthas-boot.jar [INFO] JAVA_HOME: /usr/lib/jvm/java-1.8.0- ... 
- 使用Stable Diffusion生成艺术二维码
			在数字艺术的世界中,二维码已经从单纯的信息承载工具转变为可以展示艺术表达的媒介.这是通过使用Stable Diffusion的技术实现的,它可以将任何二维码转化为独特的艺术作品.接下来,我们将一步步教 ... 
