题目大意:给你一些水源,让你求给定区间当中的最大值。
算法思想:线段树求区间最大。
#include<iostream> #include<cstdio> using namespace std; typedef struct Node { int value; int l; int r; }; Node tree[1050*4]; int a[10050]; void build_tree(int v,int l,int r) { tree[v].l=l; tree[v].r=r; if(l==r) { tree[v].value=a[l]; return; } else { int mid=(l+r)/2; build_tree(v*2,l,mid); build_tree(v*2+1,mid+1,r); tree[v].value=max(tree[v*2].value,tree[v*2+1].value); } } int query(int v,int l,int r) { if(tree[v].l==l&&tree[v].r==r) { return tree[v].value; } int mid=(tree[v].l+tree[v].r)/2; if(r<=mid) { query(v*2,l,r); } else { if(l>mid) query(v*2+1,l,r); else { int max1=query(v*2,l,mid); int max2=query(v*2+1,mid+1,r); return max(max1,max2); } } } void update(int v,int add,int p) { if(tree[v].l==tree[v].r) { tree[v].value+=add; return; } int mid=(tree[v].l+tree[v].r)/2; if(p<=mid) update(v*2,add,p); else update(v*2+1,add,p); tree[v].value=tree[v*2].value+tree[v*2+1].value; } int t,n,q; int main() { scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } build_tree(1,1,n); scanf("%d",&q); int l,r; for(int i=1;i<=q;i++) { scanf("%d%d",&l,&r); int ans=query(1,l,r); printf("%d\n",ans); } } return 0; }