poj 3264
Balanced Lineup
Time Limit: 5000MS |
|
Memory Limit: 65536K |
Total Submissions: 44506 |
|
Accepted: 20902 |
Case Time Limit: 2000MS |
Description
For the dailymilking, Farmer John's N cows (1 ≤ N ≤ 50,000)always line up in the same order. One day Farmer John decides to organize agame of Ultimate Frisbee with some of the cows. To keep things simple, he willtake a contiguous(连续的) range of cows from the milking lineup(阵容) to play the game. However, for all the cowsto have fun they should not differ too much in height.
Farmer John has madea 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 todetermine the difference in height between the shortest and the tallest cow inthe group.
Input
Line 1:Two space-separated integers(整数), N and Q.
Lines 2..N+1: Line i+1contains 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 tallestand shortest cow in the range.
SampleInput
6 3
1
7
3
4
2
5
1 5
4 6
2 2
SampleOutput
6
3
0
Source
线段树解法
Problem: 3264
User: ksq2013
Memory: 1692K
Time: 3891MS
Language: G++
Result: Accepted
#include<cstdio> #include<cstdlib> #include<iostream> using namespace std; int n,q,_max[200001],_min[200001]; void update(int s,int t,int k,int add,int p) { if(!(s^t)){ _max[k]=_min[k]=p; return; }int m=(s+t)>>1; if(add<=m)update(s,m,k<<1,add,p); else update(m+1,t,k<<1|1,add,p); _max[k]=max(_max[k<<1],_max[k<<1|1]); _min[k]=min(_min[k<<1],_min[k<<1|1]); } int query1(int s,int t,int k,int l,int r) { if(l<=s&&t<=r)return _max[k]; int m=(s+t)>>1,res1=0,res2=0; if(l<=m)res1=query1(s,m,k<<1,l,r); if(m<r)res2=query1(m+1,t,k<<1|1,l,r); return max(res1,res2); } int query2(int s,int t,int k,int l,int r) { if(l<=s&&t<=r)return _min[k]; int m=(s+t)>>1,res1=0x7fffffff,res2=0x7fffffff; if(l<=m)res1=query2(s,m,k<<1,l,r); if(m<r)res2=query2(m+1,t,k<<1|1,l,r); return min(res1,res2); } int main() { scanf("%d%d",&n,&q); for(int i=1;i<=n;i++){ int x; scanf("%d",&x); update(1,n,1,i,x); } for(int i=1;i<=q;i++){ int a,b; scanf("%d%d",&a,&b); printf("%d\n",query1(1,n,1,a,b)-query2(1,n,1,a,b)); } return 0; }