HDU (线段树 单点更新) I Hate It

本文详细介绍了如何使用线段树解决单点替换和区间求最大值的问题,包括构建线段树、更新操作和查询操作的具体步骤。

和上一道题没什么变化,只不过把单点增减变成了单点替换,把区间求和变成了区间求最大值。

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 const int maxn = (1 << 20);
 6 
 7 int n, m, qL, qR, p, v;
 8 int _max[maxn];
 9 
10 void build(int o, int L, int R)
11 {
12     if(L == R) { scanf("%d", &_max[o]); return; }
13     int M = (L + R) / 2;
14     build(o*2, L, M);
15     build(o*2+1, M+1, R);
16     _max[o] = max(_max[o*2], _max[o*2+1]);
17 }
18 
19 void update(int o, int L, int R)
20 {
21     if(L == R) { _max[o] = v; return; }
22     int M = (L + R) / 2;
23     if(p <= M) update(o*2, L, M);
24     else update(o*2+1, M+1, R);
25     _max[o] = max(_max[o*2], _max[o*2+1]);
26 }
27 
28 int query(int o, int L, int R)
29 {
30     if(qL <= L && qR >= R) return _max[o];
31     int ans = -1;
32     int M = (L + R) / 2;
33     if(qL <= M) ans = max(ans, query(o*2, L, M));
34     if(qR > M) ans = max(ans, query(o*2+1, M+1, R));
35     return ans;
36 }
37 
38 char op[10];
39 
40 int main()
41 {
42     //freopen("in.txt", "r", stdin);
43 
44     while(scanf("%d%d", &n, &m) == 2)
45     {
46         build(1, 1, n);
47 
48         while(m--)
49         {
50             scanf("%s", op);
51             if(op[0] == 'Q')
52             {
53                 scanf("%d%d", &qL, &qR);
54                 printf("%d\n", query(1, 1, n));
55             }
56             else
57             {
58                 scanf("%d%d", &p, &v);
59                 update(1, 1, n);
60             }
61         }
62     }
63 
64     return 0;
65 }
代码君

 

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4456358.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值