hdu-1754 I Hate It---线段树模板题

南楼画角 提交于 2020-04-04 09:57:15

题目链接:

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

题目大意:

求区间最大值+单点修改

解题思路:

直接套用模板即可

 1 #include<bits/stdc++.h>
 2 #define MID(l, r) (l + (r - l) / 2)
 3 #define lson(o) (o * 2)
 4 #define rson(o) (o * 2 + 1)
 5 using namespace std;
 6 typedef long long ll;
 7 const int INF = 1e9 +7;
 8 const int maxn = 1e6 + 10;
 9 int a[maxn];
10 struct node
11 {
12     int l, r, mmax, mmin, sum;
13 }tree[maxn];
14 void build(int o, int l, int r)
15 {
16     tree[o].l = l, tree[o].r = r;
17     if(l == r)
18     {
19         tree[o].mmax = tree[o].mmin = tree[o].sum = a[l];
20         return;
21     }
22     int m = MID(l, r);
23     int lc = lson(o), rc = rson(o);
24     build(lc, l, m);
25     build(rc, m + 1, r);
26     tree[o].mmax = max(tree[lc].mmax, tree[rc].mmax);
27     tree[o].mmin = min(tree[lc].mmin, tree[rc].mmin);
28     tree[o].sum = tree[lc].sum + tree[rc].sum;
29 }
30 int ql, qr;//查询区间[ql, qr]中的max,min,sum
31 int ans_max, ans_min, ans_sum;
32 void query_init()//查询前,将全局变量初始化
33 {
34     ans_max = -INF;
35     ans_min = INF;
36     ans_sum = 0;
37 }
38 void query(int o)
39 {
40     if(ql <= tree[o].l && qr >= tree[o].r)//[L, R]包含在[ql, qr]区间内,直接用该节点的信息,达到线段树查询快的操作
41     {
42         ans_max = max(ans_max, tree[o].mmax);
43         ans_min = min(ans_min, tree[o].mmin);
44         ans_sum += tree[o].sum;
45         return;
46     }
47     int m = MID(tree[o].l, tree[o].r);
48     if(ql <= m)query(lson(o));
49     if(qr > m)query(rson(o));
50 }
51 //单点更新,a[p] = v;
52 int p, v;
53 void update(int o)
54 {
55     if(tree[o].l == tree[o].r)
56     {
57         tree[o].mmax = v;
58         tree[o].mmin = v;
59         tree[o].sum = v;
60         return;
61     }
62     int m = MID(tree[o].l, tree[o].r);
63     int lc = lson(o), rc = rson(o);
64     if(p <= m)update(lc);
65     else update(rc);
66     tree[o].mmax = max(tree[lc].mmax, tree[rc].mmax);
67     tree[o].mmin = min(tree[lc].mmin, tree[rc].mmin);
68     tree[o].sum = tree[lc].sum + tree[rc].sum;
69 }
70 int main()
71 {
72     int n, m;
73     while(scanf("%d%d", &n, &m) != EOF)
74     {
75         for(int i = 1; i <= n; i++)scanf("%d", &a[i]);
76         build(1, 1, n);
77         char s[5];
78         int x, y;
79         while(m--)
80         {
81             scanf("%s%d%d", s, &x, &y);
82             if(s[0] == 'Q')
83             {
84                 ql = x, qr = y;
85                 query_init();
86                 query(1);
87                 printf("%d\n", ans_max);
88             }
89             else if(s[0] == 'U')
90             {
91                 p = x, v = y;
92                 update(1);
93             }
94         }
95     }
96     return 0;
97 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!