zoukankan      html  css  js  c++  java
  • (线段树) I Hate It --hdu--1754 (入门)

    链接:

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

    这次的代码和上个代码很相似,只不过上次的节点里存的是sum值,这次节点里存放的是Max, 正在慢慢找感觉

    节点里保存的值是十分重要的!!!!

    代码:

     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<stdlib.h>
     4 #include<string.h>
     5 using namespace std;
     6 
     7 #define Lson r<<1
     8 #define Rson r<<1|1
     9 
    10 const int N = 2*1e6+5;
    11 
    12 struct SegmentTree
    13 {
    14     int L, R;
    15     int MAX;
    16     int Mid()
    17     {
    18         return (R+L)>>1;
    19     }
    20 }a[N<<2];
    21 
    22 void BuildSegTree(int r, int L, int R)
    23 {
    24     a[r].L=L, a[r].R=R;
    25 
    26     if(L==R)
    27     {
    28         scanf("%d", &a[r].MAX);
    29         return ;
    30     }
    31 
    32     BuildSegTree(Lson, L, a[r].Mid());
    33     BuildSegTree(Rson, a[r].Mid()+1, R);
    34 
    35     a[r].MAX = max(a[Lson].MAX, a[Rson].MAX);
    36 }
    37 
    38 void Update(int r, int i, int e)
    39 {
    40     a[r].MAX = max(a[r].MAX, e);
    41 
    42     if(a[r].L==a[r].R)
    43         return ;
    44 
    45     if(i<=a[r].Mid())
    46         Update(Lson, i, e);
    47     else if(i>a[r].Mid())
    48         Update(Rson, i, e);
    49 }
    50 
    51 int Query(int r, int L, int R)
    52 {
    53     if(a[r].L==L && a[r].R==R)
    54         return a[r].MAX;
    55 
    56     if(R<=a[r].Mid())
    57        return  Query(Lson, L, R);
    58     else if(L>a[r].Mid())
    59        return Query(Rson, L, R);
    60     else
    61     {
    62         int Lsum = Query(Lson, L, a[r].Mid());
    63         int Rsum = Query(Rson, a[r].Mid()+1, R);
    64 
    65         return max(Lsum, Rsum);
    66     }
    67 }
    68 
    69 int main()
    70 {
    71    int n, m;
    72 
    73    while(scanf("%d%d", &n, &m)!=EOF)
    74    {
    75        BuildSegTree(1, 1, n);
    76 
    77        char s[20];
    78        int L, R, A, B;
    79 
    80        while(m--)
    81        {
    82            scanf("%s", s);
    83            if(s[0]=='Q')
    84            {
    85                scanf("%d%d", &L, &R);
    86                printf("%d
    ", Query(1, L, R));
    87            }
    88            else
    89            {
    90                scanf("%d%d", &A, &B);
    91                Update(1, A, B);
    92            }
    93        }
    94    }
    95    return 0;
    96 }
    勿忘初心
  • 相关阅读:
    1
    iulg
    实验10
    作业5 指针应用
    作业4 函数应用
    实验9 指针
    实验 8 数组2
    实验7
    实验6 数组1
    实验5
  • 原文地址:https://www.cnblogs.com/YY56/p/4690463.html
Copyright © 2011-2022 走看看