poj32643(线段树)
来源:互联网 发布:阿里云学生 编辑:程序博客网 时间:2024/06/16 02:07
Balanced Lineup
Time Limit: 5000MS Memory Limit: 65536KTotal Submissions: 27962 Accepted: 13136Case 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 andQ.
Lines 2..N+1: Line i+1 contains a single integer that is the height of cowi
Lines N+2..N+Q+1: Two integers A and B (1 ≤A ≤B ≤N), representing the range of cows fromA toB inclusive.
Lines 2..N+1: Line i+1 contains a single integer that is the height of cowi
Lines N+2..N+Q+1: Two integers A and B (1 ≤A ≤B ≤N), representing the range of cows fromA toB 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
本题是个简单的线段树区间查询
#include <iostream>#include<cstdio> #include <algorithm> #include <numeric>using namespace std; #define MY_MIN 99999999 #define MY_MAX -99999999 struct CNode {int L,R;int nMin,nMax; CNode * pLeft, * pRight;};int nMax, nMin;CNode Tree[1000000];//其实两倍叶子节点的数量+1就够 int nCount = 0; ////总节点数目void BuildTree(CNode * pRoot, int L,int R) { pRoot->L = L;pRoot->R = R; pRoot->nMin = MY_MIN; pRoot->nMax = MY_MAX; if ( L != R) {nCount ++; pRoot->pLeft = Tree + nCount; nCount ++; pRoot->pRight = Tree + nCount; BuildTree( pRoot->pLeft, L, ( L + R )/2);BuildTree( pRoot->pRight, (L + R) / 2 + 1,R); } }void Insert( CNode * pRoot , int i,int v) //将第i个数,其值为v,插入线段树{ if( pRoot->L == i && pRoot->R == i ) {pRoot->nMin = pRoot->nMax = v; return; } pRoot->nMin = min(pRoot->nMin,v);pRoot->nMax =max(pRoot->nMax,v); if( i <= (pRoot->L + pRoot->R )/2 ) Insert( pRoot->pLeft,i,v); else Insert( pRoot->pRight,i,v);}void Query(CNode * pRoot, int s, int e) //查询区间[s,e]中的最小值和最大值,如果更优就记在全局变量里{if( pRoot->nMin >= nMin && pRoot->nMax <= nMax ) return;if( s == pRoot->L && e == pRoot->R){ nMin = min(pRoot->nMin,nMin); nMax =max(pRoot->nMax,nMax); return ; } if( e <= (pRoot->L + pRoot->R) / 2 ) Query(pRoot->pLeft, s,e);else if( s >= (pRoot->L + pRoot->R) / 2 + 1) Query(pRoot->pRight, s,e); else{ Query(pRoot->pLeft, s,(pRoot->L + pRoot->R) / 2);Query(pRoot->pRight, (pRoot->L + pRoot->R) / 2+1 ,e); } }int main() {int n,q,h;int i,j,k; scanf("%d%d",&n,&q); nCount = 0; BuildTree(Tree,1,n);for( i = 1;i <= n;i ++ ) { scanf("%d",&h);Insert( Tree,i,h);} for( i = 0;i < q;i ++ ) { int s,e; scanf("%d%d", &s,&e); nMax = MY_MAX;nMin = MY_MIN; Query(Tree,s,e);printf("%d\n",nMax - nMin); } return 0;}
- poj32643(线段树)
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 线段_线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- (0)设计模式
- Java -- Hotspot虚拟机调优与GC垃圾回收策略
- MFC菜单
- AFNetworking 详解
- IMX51启动模式
- poj32643(线段树)
- safari中判断app是否安装
- java导出文件名 乱码
- logback 学习笔记
- c语言内部(汇编代码分析)函数调用过程探究
- 某个面试算法题
- 框架struts2和struts1线程是否安全问题探讨
- iOS手势UIGestureRecognizer
- vector、map容器删除操作总结