• HDU1892 See you~


    二维树状数组的模板题了,初始化的时候注意下,不用逐个插入,而是直接用lowbit这个函数。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #define MAX 1005
    
    int c[MAX][MAX];;
    
    inline int lowbit( int x )
    {
        return x & -x;    
    }
    
    inline void modify( int x, int y, int val )
    {
        for( int i = x; i <= 1001; i += lowbit( i ) )
        {
            for( int j = y; j <= 1001; j += lowbit( j ) )
                c[i][j] += val;
        }    
    }
    
    inline int getsum( int x, int y )
    {
        int sum = 0;
        for( int i = x; i > 0; i -= lowbit( i ) )
        {
            for( int j = y; j > 0; j -= lowbit( j ) )
                sum += c[i][j];
        }
        return sum;
    }
    
    inline void swap( int &x, int &y )
    {
        int temp = x;
        x = y;
        y = temp; 
    }
      
    inline int finalsum( int x1, int y1, int x2, int y2 )
    {
        return getsum(x2, y2)-getsum(x1-1, y2)-getsum(x2, y1-1)+getsum(x1-1, y1-1);    
    }
    
    inline void getint( int &t ) 
    { 
        char c; 
        while( c= getchar(), c< '0'|| c> '9' ) ; 
        t= c- '0'; 
        while( c= getchar(), c>= '0'&& c<= '9' ) 
        { 
            t= t* 10+ c- '0'; 
        } 
    }
      
    int main(  )
    {
        int T, N, x1, y1, x2, y2, val, sum;
        char op[10];
        getint( T );
        for( int cas = 1; cas <= T; ++cas )
        {
            printf( "Case %d:\n", cas );
            
            for( int i = 1; i <= 1001; ++i )
            {
                for( int j = 1; j <= 1001; ++j )
                {
                    c[i][j] = lowbit( i ) * lowbit( j ); 
                }    
            }
            
            scanf( "%d", &N );
            while( N-- )
            {
                scanf( "%s", op );
                if( op[0] == 'A' )
                {
                //    scanf( "%d%d%d", &x1, &y1, &val );
                    getint( x1 ), getint( y1 ), getint( val );
                    x1++, y1++;
                    modify( x1, y1, val );
                }
                else if( op[0] == 'D' )
                {
                //    scanf( "%d%d%d", &x1, &y1, &val );  
                    getint( x1 ), getint( y1 ), getint( val );  
                    x1++, y1++;
                    sum = finalsum( x1, y1, x1, y1 );
                    if( val > sum )
                        val = sum;
                    modify( x1, y1, -val );
                }
                else if( op[0] == 'M' )
                {
                //    scanf( "%d%d%d%d%d", &x1, &y1, &x2, &y2, &val );
                    getint( x1 ), getint( y1 );
                    getint( x2 ), getint( y2 ), getint( val );
                    x1++, y1 ++, x2++, y2++;
                    sum = finalsum( x1, y1, x1, y1 );
                    if( val > sum )
                        val = sum;
                    modify( x1, y1, -val );
                    modify( x2, y2, val );    
                }
                else 
                {
                //    scanf( "%d%d%d%d", &x1, &y1, &x2, &y2 );
                    getint( x1 ), getint( y1 );
                    getint( x2 ), getint( y2 );
                    x1++, y1++, x2++, y2++;
                    if( x1 > x2 )   swap( x1, x2 );
                    if( y1 > y2 )   swap( y1, y2 );
                    printf( "%d\n", finalsum( x1, y1, x2, y2 ) );    
                }
            }
        }  
        return 0;  
    }
    
  • 相关阅读:
    数据解压
    子区域数据合并
    数据压缩复制
    将Win10变回Win7/WinXP界面
    通过GP加载卫星云图-雷达图-降雨预报图
    Maven版本与JDK版本
    由输入法随想
    selinux开关
    android studio 配置
    NodeJS 笔记
  • 原文地址:https://www.cnblogs.com/Lyush/p/2353177.html
Copyright © 2020-2023  润新知