POJ 3264-Balanced Lineup詳解(線段樹區間求值)
Balanced Lineup
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 43147 | Accepted: 20265 | |
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 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 from A 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 from A 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 3 1 7 3 4 2 5 1 5 4 6 2 2
Sample Output
6 3 0
Source
USACO 2007 January Silver
題意是說:
給定一些座標點和值,求區間內最大最小值的差。
給定Q (1 ≤ Q ≤ 200,000)個數A1,A2 … AQ,多次求任一區間Ai– Aj中最大數和最小數的差。
只是剛學習線段樹,想說說建樹和插入。
以題目中的Input為例:
建樹。
是分割區間,遞迴建。
題意是說:
給定一些座標點和值,求區間內最大最小值的差。
給定Q (1 ≤ Q ≤ 200,000)個數A1,A2 … AQ,多次求任一區間Ai– Aj中最大數和最小數的差。
只是剛學習線段樹,想說說建樹和插入。
以題目中的Input為例:
建樹。
是分割區間,遞迴建。
分割區間是指,將所有的數的個數不斷均分劃成兩顆子樹,直到L=R。
如圖:
插入:
這樣就分完了:
分別是
root,L,R,Min,Max
程式碼fromhttp://acm.pku.edu.cn/summerschool/pku_acm_train.htm
插入:
這樣就分完了:
分別是
root,L,R,Min,Max
程式碼fromhttp://acm.pku.edu.cn/summerschool/pku_acm_train.htm
#include <iostream>
#include <cstdio>
using namespace std;
const int INF = 0xffffff0;
int minV = INF;
int maxV = -INF;
struct Node //不要左右子節點指標的做法
{
int L, R;
int minV,maxV;
int Mid()
{
return (L+R)/2;
}
};
Node tree[800010]; //4倍葉子節點的數量就夠
void BuildTree(int root, int L, int R) //0 1 6
{
tree[root].L = L;
tree[root].R = R;
tree[root].minV = INF;
tree[root].maxV = - INF;
if( L != R )
{
BuildTree(2*root+1,L,(L+R)/2);
BuildTree(2*root+2,(L+R)/2 + 1, R);
}
}
void Insert(int root, int i,int v)//0 i v
//將第i個數,其值為v,插入線段樹
{
if( tree[root].L == tree[root].R )//單值節點
{
//成立則亦有 tree[root].R == i
tree[root].minV = tree[root].maxV = v;
return;
}
tree[root].minV = min(tree[root].minV,v);
tree[root].maxV = max(tree[root].maxV,v);
if( i <= tree[root].Mid() )
Insert(2*root+1,i,v);
else
Insert(2*root+2,i,v);
}
void Query(int root,int s,int e)
//查詢區間[s,e]中的最小值和最大值,如果更優就記在全域性變數裡
{
if( tree[root].minV >= minV && tree[root].maxV <= maxV )
return;
if( tree[root].L == s && tree[root].R == e )
{
minV = min(minV,tree[root].minV);
maxV = max(maxV,tree[root].maxV);
return ;
}
if( e <= tree[root].Mid())
Query(2*root+1,s,e);
else if( s > tree[root].Mid() )
Query(2*root+2,s,e);
else
{
Query(2*root+1,s,tree[root].Mid());
Query(2*root+2,tree[root].Mid()+1,e);
}
}
int main()
{
int n,q,h;
int i;
scanf("%d%d",&n,&q);
BuildTree(0,1,n);
for( i = 1; i <= n; i ++ )
{
scanf("%d",&h);
Insert(0,i,h);
}
for( i = 0; i <= 12; i ++ )
cout<<i<<" "<<tree[i].L<<" "<<tree[i].R<<" "<<tree[i].minV<<" "<<tree[i].maxV<<endl;
for( i = 0; i < q; i ++ )
{
int s,e;
scanf("%d%d", &s,&e);
minV = INF;
maxV = -INF;
Query(0,s,e);
printf("%d\n",maxV - minV);
}
return 0;
}
/*
6 3
1
7
3
4
2
5
1 5
4 6
2 2
*/
相關文章
- POJ 3468 A Simple Problem with Integers(線段樹區間操作)
- POJ 3468 A Simple Problem with Integers (線段樹 區間更新)
- POJ 3468 A Simple Problem with Integers (線段樹 區間共加)
- POJ 3468-A Simple Problem with Integers(區間更新線段樹)
- POJ 3468 【區間修改+區間查詢 樹狀陣列 | 線段樹 | 分塊】陣列
- POJ 3264 Balanced Lineup 線段樹入門(點的查詢)
- POJ 3264-Balanced Lineup(RMQ-ST演算法)MQ演算法
- POJ 2528 Mayor's posters (線段樹 區間更新+離散化)
- POJ 2528 Mayor's posters (線段樹區間更新 + 離散化)
- POJ 2777-Count Color(線段樹-區間染色查詢)
- hihocoder 1078 線段樹的區間修改 (線段樹 區間更新 模板)
- 線段樹(超詳解)
- 線段樹(3)——區間操作疊加
- 芻議線段樹 2 (區間修改,區間查詢)
- 區間演算法題用線段樹可以秒解?演算法
- 線段樹維護區間等差數列
- HDU 1754 I Hate It (線段樹 區間最值)
- Java 演算法-區間求和I(線段樹)Java演算法
- HDU 1698 Just a Hook (線段樹區間更新)Hook
- Codeforces 52C (線段樹區間更新)
- 區間k小值(可持久化線段樹)持久化
- POJ 2991 Crane(線段樹+計算幾何)
- hdu 2665 可持久化線段樹求區間第K大值(函式式線段樹||主席樹)持久化函式
- 1082 線段樹練習 3 區間查詢與區間修改
- 線段樹詳解 (原理,實現與應用)
- POJ 2777 Count Color 線段樹入門題
- POJ 2828 Buy Tickets 線段樹入門(建樹稍微有點抽象)抽象
- HDU1698 Just a Hook【線段樹基礎:區間修改+區間查詢】Hook
- poj 3237 樹鏈剖分(區間更新,區間查詢)
- POJ 2886 Who Gets the Most Candies?(線段樹+反素數)
- Codeforces 272C Dima and Staircase (線段樹區間更新 或 線性掃)AI
- 【樹狀陣列 區間修改,單點求值】1556 Color the ball陣列
- 【RMQ】poj 3264 Balanced LineupMQ
- poj--3264Balanced Lineup+ST演算法求區間最大最小值演算法
- 線~段~樹
- 線段樹
- POJ 2582 Mayor's posters 線段樹入門題+離散化
- TZOJ 8472 : Tree (重鏈剖分+線段樹) POJ 3237