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 很多学校流行一种比较的习惯。

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
题目链接: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 }

 

目录
相关文章
|
6月前
poj 2352 Stars 树状数组
树状数组,简单题,我刚刚开始学的时候就a了,不多说什么了,直接贴代码。
19 0
|
8月前
UVa302 - John's trip(并查集、欧拉回路、DFS)
UVa302 - John's trip(并查集、欧拉回路、DFS)
36 0
[HDU 4738] Caocao‘s Bridges | Tarjan 求割边
Problem Description Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi. But he wouldn’t give up. Caocao’s army still was not good at water battles, so he came up with another idea. He built many islands in the Changjiang river,
108 0
HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)
HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)
89 0
|
C语言
HDOJ/HDU Tempter of the Bone(深搜+奇偶性剪枝)
HDOJ/HDU Tempter of the Bone(深搜+奇偶性剪枝)
79 0
|
算法 C++
HDOJ(HDU) 2109 Fighting for HDU(简单排序比较)
HDOJ(HDU) 2109 Fighting for HDU(简单排序比较)
89 0
|
机器学习/深度学习
HDOJ(HDU) 2083 简易版之最短距离(中位数)
HDOJ(HDU) 2083 简易版之最短距离(中位数)
117 0
|
算法
HDOJ/HDU 1015 Safecracker(深搜)
HDOJ/HDU 1015 Safecracker(深搜)
77 0
HDOJ/HDU 2551 竹青遍野(打表~)
HDOJ/HDU 2551 竹青遍野(打表~)
87 0