• HDU 1754 I Hate It


    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1754

    线段树节点更新练习

    第四棵线段树……TUT……初始化的时候忘了把cnt设为0, RE了几次……=3=

     1 #include <cstdio>
     2 #include <cstring>
     3 
     4 const int MAXN = 200000 + 10;
     5 
     6 struct Node
     7 {
     8     int r, l;
     9     int max;
    10     Node *l_child, *r_child;
    11 };
    12 
    13 Node Tree[MAXN + MAXN];
    14 int N, M;
    15 int cnt;
    16 
    17 int GetMax( int a, int b )
    18 {
    19     return a > b ? a : b;
    20 }
    21 
    22 void BuildTree( int l, int r, Node *Td )
    23 {
    24     Td->l = l;
    25     Td->r = r;
    26     if ( l == r )
    27     {
    28         scanf( "%d", &Td->max );
    29         return;
    30     }
    31 
    32     ++cnt;
    33     Td->l_child = Tree + cnt;
    34     BuildTree( l, (l + r) / 2, Td->l_child );
    35 
    36     ++cnt;
    37     Td->r_child = Tree + cnt;
    38     BuildTree( (l + r) / 2 + 1, r, Td->r_child );
    39 
    40     Td->max = GetMax( Td -> l_child -> max, Td -> r_child -> max );
    41 
    42     return;
    43 }
    44 
    45 void Update( int ii, int &e, Node *Td )
    46 {
    47     if ( ii == Td -> l && ii == Td -> r )
    48     {
    49         Td -> max = e;
    50         return;
    51     }
    52 
    53     if ( ii <= ( Td -> l + Td -> r ) / 2 )
    54        Update( ii, e, Td -> l_child );
    55     else if ( ii > ( Td -> l + Td -> r ) / 2 ) Update( ii, e, Td -> r_child );
    56 
    57     Td->max = GetMax( Td -> l_child -> max, Td -> r_child -> max );
    58 
    59     return;
    60 }
    61 
    62 int Query( int l, int r, Node *Td )
    63 {
    64     if ( l == Td -> l && r == Td -> r )
    65         return Td -> max;
    66 
    67     if ( r <= ( Td -> l + Td -> r ) / 2 ) return Query( l, r, Td -> l_child );
    68     else if ( l > ( Td -> l + Td -> r ) / 2 ) return Query( l, r, Td -> r_child );
    69     else return GetMax( Query( l, ( Td -> l + Td -> r ) / 2, Td -> l_child ),  Query( ( Td -> l + Td -> r ) / 2 + 1, r, Td -> r_child ) );
    70 }
    71 
    72 int main()
    73 {
    74     char op[4];
    75     while ( scanf( "%d%d", &N, &M ) != EOF )
    76     {
    77         cnt = 0;
    78         BuildTree( 1, N, Tree );
    79         for ( int i = 0; i < M; ++i )
    80         {
    81             int a, b;
    82             scanf( "%s%d%d", op, &a, &b );
    83             switch( op[0] )
    84             {
    85                 case 'Q':
    86                 printf( "%d\n", Query( a, b, Tree ) );
    87                 break;
    88 
    89                 case 'U':
    90                 Update( a, b, Tree );
    91                 break;
    92             }
    93         }
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- ApiWrapper
    Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- Messenger
    Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- AIDL
    Android Stutio -- 编译报错: Error:File path too long on Windows, keep below 240
    Android -- 手势操作识别
    Android -- 屏幕适配
    Android -- android:configChanges
    Java -- Date相关
    Java -- File
    links
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/2742454.html
Copyright © 2020-2023  润新知