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

                I Hate It

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

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4
 5 const int maxn=200000*4+10;
 6
 7 int MAX[maxn];
 8
 9 void pushplus(int rt)
10 {
11     MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]);
12 }
13
14 void build(int l,int r,int rt)
15 {
16     if(l==r)
17     {
18         scanf("%d\n",&MAX[rt]);
19         return;
20     }
21     int temp=(l+r)>>1;
22     build(l,temp,rt<<1);
23     build(temp+1,r,rt<<1|1);
24     pushplus(rt);
25 }
26
27 int query(int L,int R,int l,int r,int rt)
28 {
29     int temp,ans=0;
30     if(l>=L&&r<=R)
31     return MAX[rt];
32     temp=(l+r)>>1;
33     if(L<=temp)
34     ans=max(ans,query(L,R,l,temp,rt<<1));
35     if(R>temp)
36     ans=max(ans,query(L,R,temp+1,r,rt<<1|1));
37     return ans;
38 }
39
40 void update(int p,int val,int l,int r,int rt)
41 {
42     if(l==r)
43     {
44         MAX[rt]=val;
45         return;
46     }
47     int temp;
48     temp=(l+r)>>1;
49     if(p<=temp)
50     update(p,val,l,temp,rt<<1);
51     else
52     update(p,val,temp+1,r,rt<<1|1);
53     pushplus(rt);
54 }
55
56 int main()
57 {
58     int n,m,a,b;
59     char c;
60     while(scanf("%d%d",&n,&m)!=EOF)
61     {
62         build(1,n,1);
63         while(m--)
64         {
65             scanf("%c %d %d",&c,&a,&b);
66             getchar();
67             if(c==‘Q‘)
68             {
69                 int ans;
70                 ans=query(a,b,1,n,1);
71                 printf("%d\n",ans);
72             }
73             else
74             update(a,b,1,n,1);
75         }
76     }
77     return 0;
78 }
时间: 2024-12-10 05:04:23

HDU 1754 I Hate It (线段树单点更新求最大值RMQ)的相关文章

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 1754 I Hate It 线段树 单点更新 区间最大值

1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<set> 7 #include<map> 8 #include<vector> 9 #include<cstring> 10 #include<stack> 11 #

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 线段树(单点更新,成段查询)

题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=1754 题解: 单点更新,成段查询. 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define lson o<<1 6 #define rson (o<<1)|1 7 #define M l+(r

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

http://acm.hdu.edu.cn/showproblem.php?pid=1754 照着hdu 1166 的模板稍加改动即可 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int sum[1000000]; void push(int rt) { sum[rt]=max(sum[rt<<1],s

【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 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 1394 Minimum Inversion Number (线段树 单点更新 求逆序数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给你一个n个数的序列,其中组成的数只有0-n,我们可以进行这么一种操作:把第一个数移到最后一个,次数不限.问,在原始数列和最新生成的数列中逆序数最小可以是多少? 刚开始以为需要枚举求逆序数,但最后知道了这个题是有规律的:一个由0-n组成的n个数的数列,当第一个数移到最后一位的时候,整个数列的逆序数会减少x[i](移动前,后面比他小的),会增加n-x[i]-1(移动后,前面比他大的). 那

HDU - 3074 - Multiply game (线段树-单点更新,区间求积)

题目传送:Multiply game 思路:简单线段树,单点更新,区间求积,这是上次选拔赛选的题,一看题就是线段树,不过当时线段树不太熟,没敢敲,现在看来居然如此轻松,不过注意这里有大量输出,用printf,居然在这里TLE了一次... AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #incl