[关闭]
@lychee123 2017-02-25T04:48:04.000000Z 字数 1574 阅读 1609

HDU 1754 - I Hate It(简单线段树,求区间最大值,区间点更新)

数据结构


题面链接
题意

Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0 学生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<stdio.h>
  2. #include<string.h>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<math.h>
  6. #include<stdlib.h>
  7. #include<string>
  8. using namespace std;
  9. #define MAXN 2000022
  10. int n,x,y,k,i,j,m,a[200022];
  11. char s[2];
  12. struct node
  13. {
  14. int l,r,max1;
  15. }tr[MAXN*4];//一定要*4
  16. void build(int id,int l,int r)
  17. //建树
  18. {
  19. tr[id].l=l;
  20. tr[id].r=r;
  21. if(l==r)
  22. {
  23. tr[id].max1=a[l];
  24. }
  25. else
  26. {
  27. int mid=(l+r)/2;
  28. build(id*2,l,mid);//左儿子
  29. build(id*2+1,mid+1,r);//右儿子
  30. tr[id].max1=max(tr[id*2].max1,tr[id*2+1].max1);//合并
  31. }
  32. }
  33. int quary(int id,int l,int r)
  34. //查询区间[l,r]的最大值
  35. {
  36. if(l<=tr[id].l&&tr[id].r<=r)
  37. return tr[id].max1;
  38. else
  39. {
  40. int mid=(tr[id].l+tr[id].r)/2;
  41. if(r<=mid)//要找的区间在左边
  42. return quary(id*2,l,r);
  43. else if(l>mid)//要找的区间在右边
  44. return quary(id*2+1,l,r);
  45. else//在之间
  46. {
  47. int x=quary(id*2,l,r);//左边
  48. int y=quary(id*2+1,l,r);//右边
  49. return max(x,y);//合并求最大值
  50. }
  51. }
  52. }
  53. void update(int id,int pos,int val)
  54. //单点更新,把a[pos]修改成val
  55. {
  56. if(tr[id].l==tr[id].r)
  57. tr[id].max1=val;
  58. else
  59. {
  60. int mid=(tr[id].l+tr[id].r)/2;
  61. if(pos<=mid)//往左
  62. update(id*2,pos,val);
  63. else//往右
  64. update(id*2+1,pos,val);
  65. tr[id].max1=max(tr[id*2].max1,tr[id*2+1].max1);
  66. }
  67. }
  68. int main()
  69. {
  70. while(~scanf("%d%d",&n,&m))
  71. {
  72. for(i=1;i<=n;i++)
  73. {
  74. scanf("%d",&a[i]);
  75. }
  76. build(1,1,n);
  77. for(i=0;i<m;i++)
  78. {
  79. scanf("%s%d%d",s,&x,&y);
  80. if(s[0]=='U')
  81. update(1,x,y);//void函数没有返回值,直接这样写 。不需要printf
  82. if(s[0]=='Q')
  83. printf("%d\n",quary(1,x,y));
  84. }
  85. }
  86. return 0;
  87. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注