【线段树】HDU 5443 The Water Problem

来源:互联网 发布:win10 php环境搭建 编辑:程序博客网 时间:2024/05/09 07:15
题目链接:

  http://acm.hdu.edu.cn/showproblem.php?pid=5443

题目大意

  T组数据。n个值,m个询问,求区间l到r里的最大值。(n,m<=1000)

题目思路:

  【线段树】

  线段树裸题。求区间最大值。

 

////by coolxxx//#include<iostream>#include<algorithm>#include<string>#include<iomanip>#include<memory.h>#include<time.h>#include<stdio.h>#include<stdlib.h>#include<string.h>//#include<stdbool.h>#include<math.h>#define min(a,b) ((a)<(b)?(a):(b))#define max(a,b) ((a)>(b)?(a):(b))#define abs(a) ((a)>0?(a):(-(a)))#define lowbit(a) (a&(-a))#define sqr(a) ((a)*(a))#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))#define eps (1e-8)#define J 10000000#define MAX 0x7f7f7f7f#define PI 3.1415926535897#define N 1004using namespace std;typedef long long LL;int cas,cass;int n,m,lll,ans;int t[N<<2];void change(int l,int r,int a,int k,int x){if(a>r || a<l || l>r)return;if(l==r && l==a){t[k]=x;return;}change(l,(l+r)/2,a,k+k,x);change((l+r)/2+1,r,a,k+k+1,x);t[k]=max(t[k+k],t[k+k+1]);}int query(int l,int r,int a,int b,int k){if(l>r || l>b || r<a)return 0;if(a<=l && r<=b)return t[k];int mid=(l+r)/2,x1,x2;x1=query(l,mid,a,b,k+k);x2=query(mid+1,r,a,b,k+k+1);return max(x1,x2);}int main(){#ifndef ONLINE_JUDGE//freopen("1.txt","r",stdin);//freopen("2.txt","w",stdout);#endifint i,j,l,r,x;for(scanf("%d",&cas);cas;cas--)//for(scanf("%d",&cas),cass=1;cass<=cas;cass++)//while(~scanf("%s",s))//while(~scanf("%d",&n)){memset(t,0,sizeof(t));scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&x);change(1,n,i,1,x);}scanf("%d",&m);for(i=1;i<=m;i++){scanf("%d%d",&l,&r);printf("%d\n",query(1,n,l,r,1));}}return 0;}/*////*/


0 0
原创粉丝点击