HDU5443 线段树基础题 xingxing在努力
算是线段树的基础入门题吧
直接贴代码, 哎, 同学不理解真够醉的, 不是说这题啊。。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1000 + 10; int n; int a[maxn]; struct segment { int l, r; int x; //l-r区间内的最大值 }seg[3*maxn]; void build(int rt, int l, int r) { seg[rt].l = l; seg[rt].r = r; if(l == r) { seg[rt].x = a[l]; return ; } int chl = 2*rt, chr = 2*rt+1; build(chl, l, (l+r)/2); build(chr, (l+r)/2+1, r); seg[rt].x = max(seg[chl].x, seg[chr].x); } int query(int rt, int l, int r) { if(seg[rt].l==l && seg[rt].r==r) { return seg[rt].x; } int mid = (seg[rt].l+seg[rt].r)/2; if(r <= mid) return query(2*rt, l, r); else if(l > mid) return query(2*rt+1, l, r); else { int v1 = query(2*rt, l, mid); int v2 = query(2*rt+1, mid+1, r); return max(v1, v2); } } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d", &n); if(n==0) continue; for(int i=1; i<=n; i++) scanf("%d", &a[i]); build(1, 1, n); int q; scanf("%d", &q); for(int i=0; i<q; i++) { int l, r; scanf("%d%d", &l, &r); printf("%d\n", query(1, l, r)); } } return 0; }

浙公网安备 33010602011771号