博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 5443 The Water Problem(线段树水题)
阅读量:4139 次
发布时间:2019-05-25

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

The Water Problem

Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 160 Accepted Submission(s): 130
Problem Description
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 .
Input
First you are given an integer
T(T10) indicating the number of test cases. For each test case, there is a number
n(0n1000) 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(0q1000) representing the number of queries. After that, there will be
q lines with two integers
l and
r(1lrn) indicating the range of which you should find out the biggest water source.
Output
For each query, output an integer representing the size of the biggest water source.
Sample Input
3110011 151 2 3 4 551 21 32 43 43 531 999999 141 11 22 33 3
Sample Output
1002344519999999999991
Source
#include 
#include
#include
#include
#include
#include
using namespace std;const int N=1000*4;struct Node{ int l,r,big;}node[N];void Init(int now,int le,int ri){ if(le==ri){ scanf("%d",&node[now].big); node[now].l=le; node[now].r=ri; // printf("%d %d %d %d\n",now,node[now].l,node[now].r,node[now].big); return; } int mid=(le+ri)>>1; int ne=now<<1; node[now].l=le; node[now].r=ri; Init(ne,le,mid); Init(ne+1,mid+1,ri); node[now].big=max(node[ne].big,node[ne+1].big); //printf("%d %d %d %d\n",now,node[now].l,node[now].r,node[now].big);}int find(int now,int a,int b){ int mid=(node[now].l+node[now].r)>>1; int ne=now<<1; if(a==node[now].l&&b==node[now].r) return node[now].big; else if(b<=mid) return find(ne,a,b); else if(a>mid) return find(ne+1,a,b); else return max(find(ne,a,mid),find(ne+1,mid+1,b));}int main(){ int t,n,i,j,a,b; scanf("%d",&t); while(t--){ scanf("%d",&n); Init(1,1,n); scanf("%d",&i); while(i--){ scanf("%d%d",&a,&b); printf("%d\n",find(1,a,b)); } } return 0;}

转载地址:http://eymvi.baihongyu.com/

你可能感兴趣的文章
第三方开源库:nineoldandroid:ValueAnimator 动态设置textview的高
查看>>
第三方SDK:百度地图SDK的使用
查看>>
Android studio_迁移Eclipse项目到Android studio
查看>>
JavaScript setTimeout() clearTimeout() 方法
查看>>
CSS border 属性及用border画各种图形
查看>>
转载知乎-前端汇总资源
查看>>
JavaScript substr() 方法
查看>>
JavaScript slice() 方法
查看>>
JavaScript substring() 方法
查看>>
HTML 5 新的表单元素 datalist keygen output
查看>>
(转载)正确理解cookie和session机制原理
查看>>
jQuery ajax - ajax() 方法
查看>>
将有序数组转换为平衡二叉搜索树
查看>>
最长递增子序列
查看>>
从一列数中筛除尽可能少的数,使得从左往右看这些数是从小到大再从大到小...
查看>>
判断一个整数是否是回文数
查看>>
经典shell面试题整理
查看>>
腾讯的一道面试题—不用除法求数字乘积
查看>>
素数算法
查看>>
java多线程环境单例模式实现详解
查看>>