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): 70863    Accepted Submission(s): 27424

Problem Description

很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

Input

本题目包含多组测试,请处理到文件结束。 在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。 学生ID编号分别从1编到N。 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。 接下来有M行。每一行有一个字符 C (只取‘Q‘或‘U‘) ,和两个正整数A,B。 当C为‘Q‘的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。 当C为‘U‘的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。

Output

对于每一次询问操作,在一行里面输出最高成绩。

Sample Input

5 6

1 2 3 4 5

Q 1 5

U 3 6

Q 3 4

Q 4 5

U 2 9

Q 1 5

Sample Output

5

6

5

9

Hint

Huge input,the C function scanf() will work better than cin

Author

linle

Source

2007省赛集训队练习赛(6)_linle专场

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

线段树,更新节点,区间求最值

思路:这个题完全就是线段树的一个基础应用,就是建一个静态树,然后不根据输入区维护各个区间上的最值。用到了三个基本操作,建树,更新,查询。

昨天听完学长讲课,今天就来写一道线段树的模版题,纯模版,可以来围观看看!觉得好的可以点个赞表示鼓励哦!

以下代码给出了详细的注释,方便大家理解记忆线段树的建树以及更新过程,算是对上一篇博客的补充吧!

下面给出AC代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define maxsize 200020
 4 typedef struct
 5 {
 6     int left,right;
 7     int maxn;
 8 }Node;
 9 int n,m;
10 int num[maxsize];
11 Node tree[maxsize*20];
12 int buildtree(int root,int left,int right)// 构建线段树
13 {
14     int mid;
15     tree[root].left=left;
16     tree[root].right=right;// 当前节点所表示的区间
17     if(left==right)// 左右区间相同,则此节点为叶子,max 应储存对应某个学生的值
18         return tree[root].maxn=num[left];
19     mid=(left+right)/2;
20     int a,b;// 递归建立左右子树,并从子树中获得最大值
21     a=buildtree(2*root,left,mid);
22     b=buildtree(2*root+1,mid+1,right);
23     return tree[root].maxn=max(a,b);
24 }
25 int find(int root,int left,int right)// 从节点 root 开始,查找 left 和 right 之间的最大值
26 {
27     int mid;
28     if(tree[root].left>right||tree[root].right<left)// 若此区间与 root 所管理的区间无交集
29         return 0;
30     if(left<=tree[root].left&&tree[root].right<=right)// 若此区间包含 root 所管理的区间
31         return tree[root].maxn;
32     mid=(left+right)/2;
33     int a,b;// 若此区间与 root 所管理的区间部分相交
34     a=find(2*root,left,right);
35     b=find(2*root+1,left,right);
36     return max(a,b);
37 }
38 int update(int root,int pos,int val)// 更新 pos 点的值
39 {
40     if(pos<tree[root].left||pos>tree[root].right)// 若 pos 不存在于 root 所管理的区间内
41         return tree[root].maxn;
42     if(tree[root].left==pos&&tree[root].right==pos)// 若 root 正好是一个符合条件的叶子
43         return tree[root].maxn=val;
44     int a,b;// 否则。。。。
45     a=update(2*root,pos,val);
46     b=update(2*root+1,pos,val);
47     tree[root].maxn=max(a,b);
48     return tree[root].maxn;
49 }
50 int main()
51 {
52     char c;
53     int i;
54     int x,y;
55     while(scanf("%d%d",&n,&m)!=EOF)
56     {
57         for(i=1;i<=n;i++)
58             scanf("%d",&num[i]);
59         buildtree(1,1,n);
60         for(i=1;i<=m;i++)
61         {
62             getchar();
63             scanf("%c%d%d",&c,&x,&y);
64             if(c==‘Q‘)
65                 printf("%d\n",find(1,x,y));
66             else
67             {
68                 num[x]=y;
69                 update(1,x,y);
70             }
71         }
72     }
73     return 0;
74 }
时间: 2024-10-11 00:48:37

HDU 1754 I Hate It(线段树之单点更新,区间最值)的相关文章

hdu 1754 I Hate It(线段树之 单点更新+区间最值)

I Hate It                                                                             Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 非常多学校流行一种比較的习惯.老师们非常喜欢询问.从某某到某某其中,分数最高的是多少. 这让非常多学生非常反感. 无论你

hdu 1754 I Hate It(线段树 之 单点更新 求最值)

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

hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)

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

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): 39163    Accepted Submission(s): 15507 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师

HDU 1166-敌兵布阵(线段树:单点更新,区间求和)

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

HDU 1394 Minimum Inversion Number (线段树,单点更新)

C - Minimum Inversion Number Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1394 Appoint description: System Crawler (2015-08-17) Description The inversio

HDU 3397 Sequence operation(线段树&#183;成段更新&#183;区间合并&#183;混合操作)

题意  给你一个只有0, 1的数组  有这些操作 0. 将[a, b]区间的所有数都改为0 1. 将[a, b]区间的所有数都改为1 2. 将[a, b]区间的所有数都取反 即与1异或 3. 输出区间[a, b]中1的个数  即所有数的和 4. 输出区间[a, b]中最大连续1的长度 对于所有的3, 4操作输出对应的答案 单个的操作都很简单  但搞在一起就有点恶心了  还好数组里的数只有0和1 线段树维护9个值 对应区间0, 1的最大长度len[i]  对应区间左端点为起点的最大0, 1长度ll

HDU 1540 Tunnel Warfare(线段树,单点更新,区间查询)

Problem Description During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast areas of north China Plain. Generally speaking, villages connected by tunnels lay in a line. Except the two at the ends, every vill

HDU 1540 Tunnel Warfare 平衡树 / 线段树:单点更新,区间合并

Tunnel Warfare                                  Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast