设为首页 加入收藏

TOP

hdu1166-敌兵布阵(线段树)
2014-11-23 19:42:26 来源: 作者: 【 】 浏览:11
Tags:hdu1166- 布阵 线段
// File Name: hdu1166.cpp   
// Author: bo_jwolf   
// Created Time: 2013年08月16日 星期五 11时27分03秒   
  
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
  
using namespace std;  
  
#define lson l , mid , rt << 1    
#define rson mid + 1 , r , rt << 1 | 1    
  
const int maxn = 55555 ;  
//int sum[ maxn << 2 ] ;   
  
struct node  
{  
    int sum ;  
}tree[ maxn << 2 ] ;  
  
void PushUp( int rt )  
{  
    tree[ rt ].sum  = tree[ rt << 1 ].sum + tree[ (rt << 1 | 1 ) ].sum ;  
}  
void build( int l , int r , int rt )  
{  
    if( l == r )  
    {  
        scanf( "%d" , &tree[ rt ].sum );  
        return ;  
    }  
    int mid = ( l + r ) >> 1 ;  
    build( lson ) ;  
    build( rson ) ;  
    PushUp( rt ) ;  
}  
  
void update( int p , int add , int l , int r , int rt )  
{  
    if( l == r )  
    {  
        tree[ rt ].sum  += add ;  
        return ;  
    }  
    int mid = ( l + r ) >> 1 ;  
    if( p <= mid )  
        update( p , add , lson ) ;  
    else  
        update( p , add , rson ) ;  
    PushUp( rt ) ;  
}  
  
int query( int L , int R , int l , int r , int rt )  
{  
    if( L <= l && r <=R )  
    {  
        return tree[ rt ].sum ;  
    }  
    int mid = ( l + r ) >> 1 ;  
    int ret = 0 ;   
    if( L <= mid )  
            ret += query( L , R , lson ) ;  
    if( R > mid )  
            ret += query( L , R , rson ) ;  
    return ret ;  
}  
  
int main()  
{  
    int T , n ;   
    scanf( "%d" , &T ) ;  
    for( int cas = 1 ; cas <= T ; ++cas )  
    {  
        printf( "Case %d:\n" , cas ) ;  
        scanf( "%d" , &n ) ;  
        build( 1 , n , 1 ) ;  
        char op[ 10 ] ;  
        while( scanf( "%s" , op ) )  
        {  
            if( op[ 0 ] == 'E' )   
                break ;  
            int a , b ;  
            scanf( "%d%d" , &a , &b ) ;  
            if( op[ 0 ] == 'Q' )  
                printf( "%d\n" , query( a , b , 1 , n , 1 ) ) ;  
            else if( op[ 0 ] == 'S' )  
                update( a , -b , 1 , n , 1 ) ;  
            else  
                update( a , b , 1 , n , 1 ) ;  
        }  
    }  
return 0;  
}  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU4614[线段树。] 下一篇hdu 3177

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言中,“指针”用 (2025-12-26 15:20:18)
·在c语言的指针运算中 (2025-12-26 15:20:15)
·C语言-函数指针与函 (2025-12-26 15:20:12)
·求navicat for mysql (2025-12-26 13:21:33)
·有哪位大哥推荐一下m (2025-12-26 13:21:30)