http://acm.hdu.edu.cn/showproblem.php?pid=1754

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

Memory Limit Exceeded了好久,就因为输入字符时,电脑比人工多录入一个空字符。
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<string>
  4. #include<cstdio>
  5. #include<cstring>
  6. #include<cmath>
  7. using namespace std;
  8. int node[];
  9. int max(int a,int b)
  10. {
  11. return a>b?a:b;
  12. }
  13. void PushUp(int t)
  14. {
  15. node[t]=max(node[t<<],node[(t<<)+]);
  16. }
  17. void build(int l,int r,int t)
  18. {
  19. int mid;
  20. mid=(l+r)>>;
  21. if(l==r)
  22. {
  23. scanf("%d",&node[t]);
  24. return ;
  25. }
  26. build(l,mid,t<<);
  27. build(mid+,r,(t<<)+);
  28. PushUp(t);
  29. }
  30. void update(int p,int add,int l,int r,int t)
  31. {
  32. int mid;
  33. mid=(l+r)>>;
  34. if(l==r)
  35. {
  36. node[t]=add;
  37. return ;
  38. }
  39. if(p<=mid)update(p,add,l,mid,t<<);
  40. else update(p,add,mid+,r,(t<<)+);
  41. PushUp(t);
  42. }
  43. int query(int ll,int rr,int l,int r,int t)
  44. {
  45. int k=;
  46. int mid=(l+r)>>;
  47. if(ll<=l && rr>=r) return node[t];
  48. if(ll<=mid) k=max(k,query(ll,rr,l,mid,t<<));
  49. if(rr>mid) k=max(k,query(ll,rr,mid+,r,(t<<)+));
  50. return k;
  51. }
  52. int main()
  53. {
  54. int l,x,n,i,T;
  55. char s;//s[5];
  56. while(scanf("%d %d",&n,&T)!=EOF)
  57. {
  58. build(,n,);
  59. for(i=;i<T;i++)
  60. {
  61. scanf("%*c%c%d%d",&s,&l,&x);
  62. //scanf("%s%d%d",s,&l,&x);
  63. if(s=='U')//if(s[0]=='U')
  64. {
  65. update(l,x,,n,);
  66. }
  67. else
  68. {
  69. printf("%d\n",query(l,x,,n,));
  70. }
  71. }
  72. }
  73. return ;
  74. }

非递归写法

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=;
  4. int sum[maxn<<];
  5. int n,m,N,x,y;
  6. char ch[];
  7. int query(int L,int R)
  8. {
  9. int ans=-;
  10. for(int i=N+L-,j=N+R+;i^j^;i>>=,j>>=)
  11. {
  12. if(~i&) ans=max(ans,sum[i^]);
  13. if(j&) ans=max(ans,sum[j^]);
  14. }
  15. return ans;
  16. }
  17. void updata(int L,int val)
  18. {
  19. sum[N+L]=val;
  20. for(int i=N+L>>;i;i>>=)
  21. sum[i]=max(sum[i<<],sum[i<<|]);
  22. }
  23. int main()
  24. {
  25. while(scanf("%d%d",&n,&m)!=EOF)
  26. {
  27. memset(sum,,sizeof(sum));
  28. N=;while(N<n+) N<<=;
  29. for(int i=;i<=n;i++)
  30. scanf("%d",&sum[N+i]);
  31. for(int i=N-;i;i--)
  32. sum[i]=max(sum[i<<],sum[i<<|]);
  33. for(int i=;i<m;i++)
  34. {
  35. scanf("%s",&ch);
  36. scanf("%d%d",&x,&y);
  37. if(ch[]=='Q') printf("%d\n",query(x,y));
  38. else updata(x,y);
  39. }
  40. }
  41. return ;
  42. }

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

  1. HDU 1166 敌兵布阵(线段树单节点更新 区间求和)

    http://acm.hdu.edu.cn/showproblem.php?pid=1166 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Dere ...

  2. HDU 1754 I Hate It(线段树之单点更新,区间最值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. poj_3468线段树成段更新求区间和

    #include<iostream> #include<string.h> #include<cstdio> long long num[100010]; usin ...

  4. HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )

    线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...

  5. HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. HDU(1754),线段树,单点替换,区间最值

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 线段树模板题,update功能是单点替换,query是访问区间最大值. #include < ...

  7. HDU 2795 Billboard (线段树单点更新 && 求区间最值位置)

    题意 : 有一块 h * w 的公告板,现在往上面贴 n 张长恒为 1 宽为 wi 的公告,每次贴的地方都是尽量靠左靠上,问你每一张公告将被贴在1~h的哪一行?按照输入顺序给出. 分析 : 这道题说明 ...

  8. hdu 1394 Minimum Inversion Number(线段树之 单点更新求逆序数)

    Minimum Inversion Number                                                                           T ...

  9. HDU - 1754 I Hate It (线段树单点修改,求区间最大值)

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

随机推荐

  1. MVVM 中 ViewModelBase和 CommandBase

    public class ViewModelBase : INotifyPropertyChanged , IDisposable { public virtual string DisplayNam ...

  2. SqlServer存储过程加密与解密

    ★ 加密存储过程 ★: IF EXISTS (SELECT name FROM sysobjects WHERE name = 'encrypt_this' AND type = 'P')   DRO ...

  3. if switch

    一.基本if结构: 1.语法:if (条件){ 代码块 } 2.执行顺序:先判断条件,条件成立则行{}内的代码,不成立则跳出if结构快既不执行{}内的代码. 3.什么情况下要用基本if选择结构:当需要 ...

  4. js小知识 正则表达

    js定义正则表达式有两种方式:普通方式,构造函数方式 正则对象是js的内置对象 正则的属性 正则的方法 js中字符串的方法 一.普通方式(双斜杠//方式):var  reg = /表达式/附加参数 表 ...

  5. 由ubuntu装好想到的

    这篇不是技术文,有点唠叨的总结.不喜勿喷. 最近开始全面学ubuntu,一翻书回忆起本科没选但是去听了的Linux.当时看的还是楚广明的fedora教程,这多年过去综合很多人的说 法,fedora不稳 ...

  6. kindEditor编写插件遇到的问题

    kindEditor是一个功能强大的在线文本编辑器,而且提供了插件扩展功能,更好的满足用户各方面的需求.在项目中,我们就有如此的需求:在kindEditor编辑器中,添加一条下划线,并且在下划线的中间 ...

  7. SpringMVC-注解映射器和适配器_20190323

    1 注解映射器和适配器 1.1 注解映射器spring3.1之前默认加载映射器是org.springframework.web.servlet.mvc.annotation.DefaultAnnota ...

  8. js的运算小数点的问题

    问题这样的: 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这 ...

  9. CSS常用样式--font

    CSS font 属性 参考:W3school- CSS font 所有浏览器都支持 font 属性,可在一个声明中设置所有字体属性,各属性需按顺序,语法如下: selector{ font:styl ...

  10. 一句话木马和中国菜刀的结合拿webshell

    什么叫做一句话木马:     就是一句简单的脚本语言,一句话木马分为Php,asp,aspx等 中国菜刀:   连接一句话木马的工具 实验的目的:  通过一句话木马来控制我们的服务器,拿到webshe ...