hdu 1166

看起来是要模拟,但是如果用朴素数据结构(随机存取数组)的话肯定会超时,所以选择了树状数组

#include <iostream> 
#include <cstring> 
#include <cstdio> 
#include <cstdlib> 
#include <cmath> 
using namespace std ; 
const int maxn = 50000+1; 
int ncase , tree[maxn] , n ; 
void init() { memset( tree , 0 , sizeof( tree ) ) ; return ; } 
int lowbit( int t ) { return t&(-t) ; } 
void insert( int k , int d , int n ) { 
    while( k <= n ) { tree[k] += d ; k += lowbit( k ) ; } return ; 
} 
int getsum( int k ) { 
    int ans = 0 ; while( k > 0 ) { ans += tree[k] ; k -= lowbit( k ) ; 
} return ans ; } void input() { scanf( "%d" , &n ) ; for( int i = 1 ; i <= n ; ++i ) { int tmp ; scanf( "%d" , &tmp ) ; insert( i , tmp , n ) ; } } void solve() { char op[10] ; int a , b ; while( scanf( "%s" , op ) == 1 && strcmp( op , "End" ) ) { scanf( "%d%d" , &a , &b ) ; if( strcmp( op , "Query" ) == 0 ) { if( a > b ) { int t = a ; a = b ; b = t ; } int t1 = getsum( a-1 ) ; int t2 = getsum( b ) ; printf( "%d/n" , t2-t1 ) ; } if( strcmp( op , "Add" ) == 0 ) { insert( a , b , n ) ; } if( strcmp( op , "Sub" ) == 0 ) { insert( a , -b , n ) ; } } return ; } void output() { return ; } int main() { int icase = 1 ; scanf( "%d" , &ncase ) ; while( ncase-- ) { printf( "Case %d:/n" , icase++ ) ; init() ; input() ; solve() ; output() ; } return 0 ; }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值