51nod 1174 区间中最大的数【线段树】
2015-10-02 19:52
309 查看
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1174
好久没写线段树了,区间最大值,水题。。代码:
#include <stdio.h> #include <iostream> #include <string> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <set> #include <map> #include <vector> #define Mid(a,b) ( a+((b-a)>>1)) #define ll(x) (x<<1) #define rr(x) (x<<1|1) const int N = 100100; using namespace std; int t, n; int a ; struct node { int left; int right; int sum; int mid() { return Mid(left, right); } }; struct segtree { node tree[N * 4]; void buildtree(int left, int right, int ind) { tree[ind].left = left; tree[ind].right = right; tree[ind].sum = 0; if (left == right) tree[ind].sum = a[left]; else { int mid = tree[ind].mid(); buildtree(left, mid, ll(ind)); buildtree(mid + 1, right, rr(ind)); tree[ind].sum = max(tree[ll(ind)].sum, tree[rr(ind)].sum); } } int query(int st, int ed, int ind) { int left = tree[ind].left; int right = tree[ind].right; if (st <= left && right <= ed) return tree[ind].sum; else { int mid = tree[ind].mid(); int sum1 = 0; int sum2 = 0; if (st <= mid) sum1 = query(st, ed, ll(ind)); if (ed > mid) sum2 = query(st, ed, rr(ind)); return max(sum1, sum2); } } }seg; int main() { while (scanf("%d", &n) != EOF) { for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } seg.buildtree(1, n, 1); int m; scanf("%d", &m); while(m--) { int c, d; scanf("%d%d", &c, &d); printf("%d\n", seg.query(c + 1, d + 1, 1)); } } return 0; }
相关文章推荐
- 线段树题集
- hdu1754
- HDU1394
- 敌兵布阵 (1)
- I Hate It (1)
- LCIS (2)
- A Simple Problem with Integers (2)
- Mayor's posters (3)
- Buy Tickets (3)
- 线段树
- UVA - 12532 Interval Product
- POJ 3264 Balanced Lineup
- hdu 1542 求矩形并的面积
- 关于数据结构之线段树
- poj 3225 关于集合运算
- poj 2352
- hdu1166敌兵布阵(线段树点修改)
- POJ 2352 Stars 线段树 pascal
- hdu 1698 Just A Hook 线段树的一道题
- HDU 1754 I Hate It