版权声明:本文为博主原创文章。未经博主同意不得转载。vasttian https://blog.csdn.net/u012860063/article/details/32982923

转载请注明出处:http://blog.csdn.net/u012860063

题目链接: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
  1.  
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
  1.  
5
6
5
9

代码例如以下:

  1. //线段树功能:update:单点替换 query:区间最值
  2. //此题为Hdu 1754
  3. #include <cstdio>
  4. #include <algorithm>
  5. using namespace std;
  6. #define lson l , mid , rt << 1
  7. #define rson mid + 1 , r , rt << 1 | 1
  8. //lson和rson分辨表示结点的左儿子和右儿子
  9. //rt表示当前子树的根(root),也就是当前所在的结点
  10. const int maxn = 222222;
  11. //maxn是题目给的最大区间,而节点数要开4倍,确切的来说节点数要开大于maxn的最小2x的两倍
  12. int sum[maxn<<2];
  13. int max(int x,int y)
  14. {
  15. if(x > y)
  16. return x;
  17. return y;
  18. }
  19. void PushUP(int rt) //把当前结点的信息更新到父结点
  20. {
  21. sum[rt] = max(sum[rt<<1],sum[rt<<1|1]);
  22. }
  23. void build(int l,int r,int rt)
  24. {
  25. if (l == r)
  26. {
  27. scanf("%d",&sum[rt]);
  28. return ;
  29. }
  30. int mid = (l + r) >> 1;
  31. build(lson);
  32. build(rson);
  33. PushUP(rt);
  34. }
  35. void update(int p,int sc,int l,int r,int rt)
  36. {
  37. if (l == r) //叶节点
  38. {
  39. sum[rt] = sc;
  40. return ;
  41. }
  42. int mid = (l + r) >> 1;
  43. if (p <= mid)//递归更新左子树或者右子树
  44. update(p , sc , lson);
  45. else
  46. update(p , sc , rson);
  47. PushUP(rt);
  48. }
  49. int query(int L,int R,int l,int r,int rt)
  50. {//查询区间[L,R]中的最大值
  51. if (L <= l && r <= R)//当前结点全然包括在查询区间内
  52. {
  53. return sum[rt];
  54. }//要取rt子节点的值时,也要先把rt的延迟标记向下移动
  55. int mid = (l + r) >> 1;
  56. int ret = 0;
  57. if (L <= mid) //往左走
  58. ret = max(ret,query(L , R , lson));
  59. if (mid < R)//往右走
  60. ret = max(ret,query(L , R , rson));
  61. return ret;
  62. }
  63. int main()
  64. {
  65. int N , M;
  66. while(~scanf("%d%d",&N,&M))//N为节点数
  67. {
  68. build(1 , N , 1); //建树
  69. while (M--)//M为询问次数
  70. {
  71. char op[2];
  72. int a , b;
  73. scanf("%s%d%d",op,&a,&b);
  74. if (op[0] == 'Q')
  75. {
  76. printf("%d\n",query(a , b , 1 , N , 1));
  77. }
  78. else
  79. {
  80. update(a , b , 1 , N , 1);//把a的成绩更为b
  81. }
  82. }
  83. }
  84. return 0;
  85. }

hdu 1754 I Hate It (线段树功能:单点更新和区间最值)的更多相关文章

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

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

  2. hdu 1754 I Hate It (线段树、单点更新)(PS:ios::sync_with_stdio(false)可以加快cin、cout的读取写出速度)

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

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

    Tunnel Warfare                                  Time Limit: 4000/2000 MS (Java/Others)    Memory Lim ...

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

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

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

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

  6. HDU 3308 LCIS (线段树&#183;单点更新&#183;区间合并)

    题意  给你一个数组  有更新值和查询两种操作  对于每次查询  输出相应区间的最长连续递增子序列的长度 基础的线段树区间合并  线段树维护三个值  相应区间的LCIS长度(lcis)  相应区间以左 ...

  7. hdu 1166 敌兵布阵 (线段树、单点更新)

    敌兵布阵Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  8. UVA12532 线段树(单点更新,区间求乘积的正负)

    It’s normal to feel worried and tense the day before a programming contest. To relax, you went out f ...

  9. POJ 3171.Cleaning Shifts-区间覆盖最小花费-dp+线段树优化(单点更新、区间查询最值)

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4721   Accepted: 1593 D ...

  10. Codeforces768B-Code For 1-类似线段树-枚举+单点更新or区间更新

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:Portal传送门  原题目描述在最下面.  每次把\(n\ ...

随机推荐

  1. NodeJS+Express开发web,为什么中文显示为乱码

    把你的文件另存为下,格式为utf-8的试下就行!

  2. Asp.net core WebApi 使用Swagger生成帮助页实例

    最近我们团队一直进行.net core的转型,web开发向着前后端分离的技术架构演进,我们后台主要是采用了asp.net core webapi来进行开发,开始每次调试以及与前端人员的沟通上都存在这效 ...

  3. <mvc:annotation-driven /> 作用

    <mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案.<mvc:annotation-dri ...

  4. 多线程系列(3)任务Task

    虽然使用线程池ThreadPool让我们使用多线程变得容易,但是因为是由系统来分配的,如果想对线程做精细的控制就不太容易了,比如某个线程结束后执行一个回调方法.恰好Task可以实现这样的需求.这篇文章 ...

  5. Java开发中常用的设计模式(一)---工厂模式

    一. 准备工作 1. 本文参考自  自己理解的工厂模式,希望对大家有所帮助 二. 开始 以汽车工厂为例,首先有个汽车类的接口 Car,里面有个开车的方法 drive(),然后有个宝马车的类 BMW 和 ...

  6. python匿名函数lambda与switch的实现

    1,lambda的语法跟es6的箭头函数差不多 >>> show=lambda x,y: x * y >>> show( 10, 20 ) 200 2,递归求阶乘 ...

  7. POJ1741(SummerTrainingDay08-G 树的点分治)

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 23380   Accepted: 7748 Description ...

  8. vue 结合 animate.css

    这里说的是vue2.0和animate.css的结合使用.其实用过就知道用法是比较简单的.但是就是刚开始使用的时候,难免有的会遇到各种问题.简单的说说我所用过并且遇过的坑. 首先是transition ...

  9. Linux CentOS下Python+robot framework环境搭建

    Linux CentOS下Python+robot framework环境搭建   by:授客 QQ:1033553122 操作系统环境:CentOS 6.5-x86_64 下载地址:http://w ...

  10. AsyncTask 处理耗时操作&&显示进度条

    在Android中实现异步任务机制有两种,Handler和AsyncTask.优缺点自己百度,推荐使用AsyncTask. private ProgressDialog dialog; //新建一个对 ...