您的位置:首页 > 其它

hdu 5443(线段树水)

2016-06-07 21:01 120 查看

The Water Problem

Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1308 Accepted Submission(s): 1038


[align=left]Problem Description[/align]
In
Land waterless, water is a very limited resource. People always fight
for the biggest source of water. Given a sequence of water sources with a1,a2,a3,...,an representing the size of the water source. Given a set of queries each containing 2 integers l and r, please find out the biggest water source between al and ar.

[align=left]Input[/align]
First you are given an integer T(T≤10) indicating the number of test cases. For each test case, there is a number n(0≤n≤1000) on a line representing the number of water sources. n integers follow, respectively a1,a2,a3,...,an, and each integer is in {1,...,106}. On the next line, there is a number q(0≤q≤1000) representing the number of queries. After that, there will be q lines with two integers l and r(1≤l≤r≤n) indicating the range of which you should find out the biggest water source.

[align=left]Output[/align]
For each query, output an integer representing the size of the biggest water source.

[align=left]Sample Input[/align]

3
1
100
1
1 1
5
1 2 3 4 5
5
1 2
1 3
2 4
3 4
3 5
3
1 999999 1
4
1 1
1 2
2 3
3 3

[align=left]Sample Output[/align]

100
2
3
4
4
5
1
999999
999999
1

区域赛水题,区间最值。。

//单点更新+区间查找
#include<iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

const int Max = 1500;
int MAXNUM;
int a[Max];
struct Tree{
int Max;
int r,l;
}t[4*Max];
int MAX(int k,int j){
if(k>=j) return k;
return j;
}
void build(int idx,int l,int r){
t[idx].l = l;
t[idx].r=r;
if(l==r){
t[idx].Max = a[l];
return;
}
int mid = (l+r)>>1;
build(idx<<1,l,mid);
build(idx<<1|1,mid+1,r);
t[idx].Max = MAX(t[idx<<1].Max,t[idx<<1|1].Max); //父亲节点

}
void query(int idx,int l,int r,int L,int R){
if(l>=L&&r<=R) {
MAXNUM = MAX(MAXNUM,t[idx].Max);
return;
}
int mid = (l+r)>>1;
if(mid>=L)
query(idx<<1,l,mid,L,R);
if(mid<R)
query(idx<<1|1,mid+1,r,L,R);
}

int main()
{
int tcase;
scanf("%d",&tcase);
while(tcase--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++){
int l,r;
scanf("%d%d",&l,&r);
MAXNUM = -999999999;
query(1,1,n,l,r);
printf("%d\n",MAXNUM);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: