POJ 3264 线段树入门解题报告
题意:给n个值, Q次询问, 每次询问给定一个区间, 要求输出该区间最大最小值之差
思路:暴力的话每次询问都要遍历多次for循环一定会超时, 用线段树记录区间的信息(左边界右边界, 该区间最大值最小值)
代码:
#include<stdio.h>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std; int n, m, arr[];
int ansmax, ansmin; struct Tree
{
int maxx, minn, left, right; //记录区间信息
}tree[ * ]; //开四倍空间 void build(int left, int right, int k)
{
tree[k].left = left, tree[k].right = right; //区间左右
if(tree[k].left == tree[k].right)
{
tree[k].maxx = tree[k].minn = arr[left]; //分到最后只剩下一个值 记为最大最小值
return ;
}
int mid = (left + right)/;
build(left, mid, k * ); //往左右儿子构造线段树
build(mid + , right, k * + );
tree[k].maxx = max(tree[k * ].maxx, tree[k * + ].maxx); //满足区间相加.子区间之间的最大最小值也是父亲区间的最大最小值
tree[k].minn = min(tree[k * ].minn, tree[k * + ].minn);
} void query(int k, int left, int right, int find_left, int find_right)
{ //如果ansmax已经大于等于该点区间最大值,ansmin已经小于等于该点区间最小值 , 不用更新,return
if(ansmax >= tree[k].maxx && ansmin <= tree[k].minn)
return ;
if(find_left == left && find_right == right)
{ //查询区间刚好是某个节点的区间, 该区间已经记录了最大最小值信息,可以直接调用并return
ansmax = max(ansmax, tree[k].maxx);
ansmin = min(ansmin, tree[k].minn);
return ;
}
int mid = (left + right)/;
if(find_right <= mid) //查询区间全位于该节点的左儿子区间
query( * k, left, mid, find_left, find_right);
else if(find_left > mid)//查询区间全位于该节点的右儿子区间
query( * k + , mid + , right, find_left, find_right);
else
{ //有位于左儿子和右儿子部分
query( * k, left, mid, find_left, mid);
query( * k + , mid + , right, mid + , find_right);
}
} int main()
{
int a, b;
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i ++)//线段树根节点从1开始 ,数组从1开始存
scanf("%d", &arr[i]);
build(, n, );
for(int i = ; i <= m; i ++)
{
ansmax = -inf;
ansmin = inf;
scanf("%d%d", &a, &b);
query(, , n, a, b);
printf("%d\n", ansmax - ansmin);
}
return ;
}
POJ 3264 线段树入门解题报告的更多相关文章
- HDU 1754 线段树入门解题报告
---恢复内容开始--- 题意:给定区间,每个人的成绩, Q次询问,求每次询问区间中的最大值 思路:构造线段树 代码: #include<stdio.h> #include<algo ...
- POJ——3264线段树
题目: 输入两个数(m,n),m表示牛的头数,n表示查询的个数.查询时输入两个数(x,y),表示查询范围的起始值和终止值,查询结果是,这个区间内牛重量的最大值减去牛重量的最小值,数量级为1000,00 ...
- poj 3264 线段树 求区间最大最小值
Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same ...
- POJ - 3264 线段树模板题 询问区间最大最小值
这是线段树的一个模板题,给出一串数字,然后询问区间的最大最小值. 这个其实很好办,只需把线段树的节点给出两个权值,一个是区间的最小值,一个是区间的最大值,初始化为负无穷和正无穷,然后通过不断地输入节点 ...
- [NOIP2016 DAY1 T2]天天爱跑步-[差分+线段树合并][解题报告]
[NOIP2016 DAY1 T2]天天爱跑步 题面: B[NOIP2016 DAY1]天天爱跑步 时间限制 : - MS 空间限制 : 565536 KB 评测说明 : 2s Description ...
- poj 3264 线段树
题目意思:给定Q(1<=Q<=200000)个数A1,A2,```,AQ, 多次求任一区间Ai-Aj中最大数和最小数的差 线段树太弱了,题目逼格一高连代码都读不懂,今天开始重刷线段树,每天 ...
- 洛谷 P3373 【模板】线段树 2 解题报告
P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上\(x\) 2.将某区间每一个数加上\(x\) 3.求出某区间每一个数的和 输入输出格式 ...
- POJ 3264 线段树 ST
题意:给你一个数列,从中挑一段,问你这段数的最大值减最小值是多少. 思路:线段树. // by Sirius_Ren #include <cstdio> #include <algo ...
- G - Balanced Lineup POJ - 3264 线段树最大最小值区间查询模版题
题意 给出一个序列 每次查询区间的max-min是多少 思路:直接维护max 和min即可 写两个query分别查最大最小值 #include<cstdio> #include< ...
随机推荐
- Spring Boot系列——7步集成RabbitMQ
RabbitMQ是一种我们经常使用的消息中间件,通过RabbitMQ可以帮助我们实现异步.削峰的目的. 今天这篇,我们来看看Spring Boot是如何集成RabbitMQ,发送消息和消费消息的.同时 ...
- python和C++联合调试
python可以利用SO的方式去调用C++中的函数,但是需要一种调试方案来进行python和C++的联合调试,效果是直接在c++代码中打断点,然后python在进行c++so调用的时候,直接进入到断点 ...
- 基于Kafka的生产者消费者消息处理本地调试
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/68174111冷血之心的博客) Kafka下载地址:http://d ...
- python线程池(threadpool)模块使用笔记 .python 线程池使用推荐
一.安装与简介 pip install threadpool pool = ThreadPool(poolsize) requests = makeRequests(some_callable, li ...
- CentOS 7下PXE+Kickstart无人值守安装操作系统
1.简介 1.1. 什么是PXE PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支 ...
- HTTP缓存及其合理使用
以前以为HTTP缓存是个简单的事,项目中遇到后才发觉关于缓存实践有挺深的学问. from几篇文章详见: 使用 HTTP 缓存:Etag, Last-Modified 与 Cache-Control 合 ...
- [转]谈NAND Flash的底层结构和解析
这里我想以一个纯玩家的角度来谈谈关于NAND Flash的底层结构和解析,可能会有错误的地方,如果有这方面专家强烈欢迎指正. NAND Flash作为一种比较实用的固态硬盘存储介质,有自己的一些物理特 ...
- ss搭建
aliyun ecs ,hongkong , t5 , 1M, 1.卸载阿里云盾监控 wget http://update.aegis.aliyun.com/download/uninstall.sh ...
- Django 跨域问题
当使用Django 做接口时,被html5 或者app访问时 存在跨域问题 导致无法请求到数据,具体解决办法如下: 跨域问题解决 安装pip install django-cors-headers修改 ...
- 23命令模式Command
一.什么是命令模式 Command模式也叫命令模式 ,是行为设计模 式的一种.Command模式通过被称为 Command的类封装了对目标对象的调用行为以及调用参数. 二.命令模式的应用场景 在面向对 ...