B - I Hate It ——线段树

小鱼儿 2022-06-11 06:14 263阅读 0赞

Think:
1知识点:线段树——区间最值+单点更新
2反思:注意数组不要越界,开四倍即可

vjudge题目链接

  1. B - I Hate It
  2. 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
  3. 这让很多学生很反感。
  4. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
  5. Input
  6. 本题目包含多组测试,请处理到文件结束。
  7. 在每个测试的第一行,有两个正整数 N M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。
  8. 学生ID编号分别从1编到N
  9. 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表IDi的学生的成绩。
  10. 接下来有M行。每一行有一个字符 C (只取'Q''U') ,和两个正整数AB
  11. C'Q'的时候,表示这是一条询问操作,它询问IDAB(包括A,B)的学生当中,成绩最高的是多少。
  12. C'U'的时候,表示这是一条更新操作,要求把IDA的学生的成绩更改为B
  13. Output
  14. 对于每一次询问操作,在一行里面输出最高成绩。
  15. Sample Input
  16. 5 6
  17. 1 2 3 4 5
  18. Q 1 5
  19. U 3 6
  20. Q 3 4
  21. Q 4 5
  22. U 2 9
  23. Q 1 5
  24. Sample Output
  25. 5
  26. 6
  27. 5
  28. 9
  29. Hint
  30. Huge input,the C function scanf() will work better than cin

以下为Accepted代码

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N = 2e5 + 4e2;
  6. struct Node{
  7. int mav;
  8. }node[N*4];
  9. void Build(int l, int r, int rt);
  10. void Updata(int rt);
  11. int find_mav(int L, int R, int l, int r, int rt);
  12. void up_v(int p, int v, int l, int r, int rt);
  13. int main(){
  14. int n, m, L, R, p, v;
  15. char st[14];
  16. while(~scanf("%d %d", &n, &m)){
  17. Build(1, n, 1);
  18. while(m--){
  19. scanf("%s", st);
  20. if(st[0] == 'Q'){
  21. scanf("%d %d", &L, &R);
  22. printf("%d\n", find_mav(L, R, 1, n, 1));
  23. }
  24. else if(st[0] == 'U'){
  25. scanf("%d %d", &p, &v);
  26. up_v(p, v, 1, n, 1);
  27. }
  28. }
  29. }
  30. }
  31. void Build(int l, int r, int rt){
  32. if(l == r){
  33. scanf("%d", &node[rt].mav);
  34. return;
  35. }
  36. int mid = (l + r)/2;
  37. Build(l, mid, rt<<1);
  38. Build(mid+1, r, rt<<1|1);
  39. Updata(rt);
  40. }
  41. void Updata(int rt){
  42. node[rt].mav = max(node[rt<<1].mav, node[rt<<1|1].mav);
  43. }
  44. int find_mav(int L, int R, int l, int r, int rt){
  45. if(L <= l && r <= R)
  46. return node[rt].mav;
  47. int mid = (l + r)/2;
  48. int mav = -1;
  49. if(L <= mid)
  50. mav = max(mav, find_mav(L, R, l, mid, rt<<1));
  51. if(R > mid)
  52. mav = max(mav, find_mav(L, R, mid+1, r, rt<<1|1));
  53. return mav;
  54. }
  55. void up_v(int p, int v, int l, int r, int rt){
  56. if(l == r){
  57. node[rt].mav = v;
  58. return;
  59. }
  60. int mid = (l + r)/2;
  61. if(p <= mid && p >= l)
  62. up_v(p, v, l, mid, rt<<1);
  63. if(p > mid && p <= r)
  64. up_v(p, v, mid+1, r, rt<<1|1);
  65. Updata(rt);
  66. }

发表评论

表情:
评论列表 (有 0 条评论,263人围观)

还没有评论,来说两句吧...

相关阅读