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

题目传送门

 1 /*
 2     线段树基本功能:区间最大值,修改某个值
 3 */
 4 #include <cstdio>
 5 #include <cstring>
 6 #include <algorithm>
 7 #define lson l, m, rt << 1
 8 #define rson m+1, r, rt << 1|1
 9
10 const int MAX_N = 200000 + 10;
11 int sum[MAX_N<<2];
12 int a[MAX_N<<2];
13
14 void pushup(int rt)
15 {
16     sum[rt] = sum[rt<<1] + sum[rt<<1|1];
17 }
18
19 void maxrt(int rt)
20 {
21     sum[rt] = std::max (sum[rt<<1], sum[rt<<1|1]);
22 }
23
24 void build(int l, int r, int rt)
25 {
26     if (l == r)
27     {
28         scanf ("%d", &sum[rt]);
29         return ;
30     }
31     int m = (l + r) >> 1;
32     build (lson);
33     build (rson);
34     maxrt (rt);
35 }
36
37 void update(int p, int up, int l, int r, int rt)
38 {
39     if (l == r)
40     {
41         sum[rt] = up;
42         return ;
43     }
44     int m = (l + r) >> 1;
45     if (p <= m)    update (p, up, lson);
46     else    update  (p, up, rson);
47     maxrt (rt);
48 }
49
50 int query(int ql, int qr, int l, int r, int rt)
51 {
52     if (ql <= l && r <= qr)
53     {
54         return sum[rt];
55     }
56     int m = (l + r) >> 1;
57     int ans = 0;
58     if (ql <= m)    ans = std::max(ans, query (ql, qr, lson));
59     if (qr > m)        ans = std::max(ans, query (ql, qr, rson));
60
61     return ans;
62 }
63
64
65 int main(void)        //HDU 1754 I Hate It
66 {
67     //freopen ("inB.txt", "r", stdin);
68     int n, m, ans, b, c;
69     char ch[2];
70
71     while (~scanf ("%d%d", &n, &m))
72     {
73         build (1, n, 1);
74         while (m--)
75         {
76             scanf ("%s%d%d", &ch, &b, &c);
77             if (ch[0] == ‘Q‘)
78             {
79                 ans = query (b, c, 1, n, 1);
80                 printf ("%d\n", ans);
81             }
82             if (ch[0] == ‘U‘)
83             {
84                 update (b, c, 1, n, 1);
85             }
86         }
87     }
88
89     return 0;
90 }
时间: 2024-10-13 07:20:36

线段树(单点更新) HDU 1754 I Hate It的相关文章

线段树单点更新 hdu 1754 I Hate It

题意:给n个学生的成绩,可以动态修改某个学生的成绩,要求动态查询某个区间学生的成绩的最大值. 线段树单点更新题目,只需用一个数组存储当前节点对应的区间的成绩的最大值,并且把向上更新节点操作(pushup)改为更新该节点的两个子节点的最大值即可. 代码:

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

题目链接 中文题意,与上题类似. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <cstdlib> 6 #include <algorithm> 7 const int maxn = 200000+10; 8 using namespace std; 9 int a[maxn], n, m; 10

hdu 1754 I Hate It 线段树单点更新和区间求和

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 参照HH大牛写的额! Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input 本题目包含多

【HDU】1754 I hate it ——线段树 单点更新 区间最值

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 37448    Accepted Submission(s): 14816 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要

HDU 1754 I Hate It 线段树单点更新求最大值

题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #define N 200005 using namespace std; int data[N]; struct Tree { int l,r,ans; }tree[N*4]; void build(in

HDU 1166 敌兵布阵(线段树单点更新,板子题)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 87684    Accepted Submission(s): 36912 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

HDU 4302 线段树单点更新,维护区间最大最小值

http://acm.hdu.edu.cn/showproblem.php?pid=4302 Problem Description Holedox is a small animal which can be considered as one point. It lives in a straight pipe whose length is L. Holedox can only move along the pipe. Cakes may appear anywhere in the p

HDU 1166 敌兵布阵 (线段树 单点更新)

题目链接 线段树掌握的很差,打算从头从最简单的开始刷一波, 嗯..就从这个题开始吧! 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <cstdlib> 6 #include <algorithm> 7 const int maxn = 50000+10; 8 using namespace std

HDU 2795 Billboard (线段树单点更新)

题意:h,w,n:有一个h*w尺寸的木板,n张1*wi的海报,贴海报的位置尽量高,尽量往左,问每张海报贴的高度 看到1 <= h,w <= 10^9; 1 <= n <= 200,000,应该就是线段树了. 关键在怎么建树,这里我们对h进行分割,每个高度都有等长的w,我们从上往下贴,如果当前高度 (在同一高度上l==r)的长度可以满足wi则可以贴,否则继续往下寻找. #include <iostream> #include <stdio.h> #includ