博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ - 3264——Balanced Lineup(入门线段树)
阅读量:6734 次
发布时间:2019-06-25

本文共 2406 字,大约阅读时间需要 8 分钟。

Balanced Lineup
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 68466   Accepted: 31752
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 31734251 54 62 2

Sample Output

630 题目链接: http://poj.org/problem?id=3264 题目大意: 给定一个区间N,并初始化该区间,Q次询问区间内的最大值减最小值。 题目分析: 这是一道基础入门级的线段树题目。线段树是二分的思想。开结构体存储节点的左、右区间和最大、最小值。根节点的左区间是1,右区间是N。 父节点分成左孩子和右孩子,即左孩子的区间为父节点的左区间到父节点的中值((l+r)/2),右孩子的区间为父节点的中值加一((l+r)/2+1)到父节点的右区间。 AC代码如下:
#include
#include
using namespace std;const int MAX=1E6+10;struct s{ int left,right; int maxx,minn;}tree[MAX<<2];void btree(int k,int l,int r) //建树 { tree[k].left=l; //节点左右区间更新 tree[k].right=r; if(l==r) //叶子 { scanf("%d",&tree[k].minn); tree[k].maxx=tree[k].minn; return ; } int mid=(l+r)/2; btree(k<<1,l,mid); //左孩子 btree(k<<1|1,mid+1,r); //右孩子 tree[k].maxx=max(tree[k<<1].maxx,tree[k<<1|1].maxx); //更新节点最大值 tree[k].minn=min(tree[k<<1].minn,tree[k<<1|1].minn); //更新节点最小值 }int ma,mi;void query(int k,int l,int r) //询问 { if(tree[k].left>=l&&tree[k].right<=r) { ma=max(tree[k].maxx,ma); mi=min(tree[k].minn,mi); return ; } int mid=(tree[k].left+tree[k].right)/2; if(mid>=r) //节点中值大于询问区间右边 询问左孩子 { query(k<<1,l,r); } else if(mid
 

转载于:https://www.cnblogs.com/noback-go/p/10541706.html

你可能感兴趣的文章
LeetCode155-最小栈(优先队列/巧妙的解法)
查看>>
【转】删除cookie
查看>>
木其工作室代写程序 [原]当 IDENTITY_INSERT 设置为 OFF 时,不能为表 &#39;TB_TABLENAME&#39; 中的标识列插入显式值。...
查看>>
[洛谷P2161][SHOI2009]会场预约
查看>>
'用户 'sa' 登录失败。该用户与可信 SQL Server 连接无关联,做JSP项目连接数据库 ....
查看>>
javascript中substring和substr方法
查看>>
C# FTPHelper帮助类
查看>>
以色列之光
查看>>
Photo1
查看>>
学习方法及笔记的总结
查看>>
AHK GUI开发示例
查看>>
【JS温故知新】之——给力的鼠标坐标位置获取(转)
查看>>
MAC OS环境下搭建基于Python语言的appium自动化测试环境
查看>>
开发提测标准
查看>>
基于HTML5多图片Ajax上传可预览
查看>>
Oracle之分页查询
查看>>
C#基础教学,献给初入C#的自己和同道中人
查看>>
Sublime text插件使用技巧
查看>>
xampp下设置不显示php错误提示 关闭错误提示 屏蔽错误提示
查看>>
网站安全检测
查看>>