读书人

OJ下最简单的一题线段树但就是不知道

发布时间: 2012-08-17 02:08:34 作者: rapoo

OJ上最简单的一题线段树,但就是不知道为什么一直超时?
题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1166

希望有人看看,我实在找不出来哪里错了。

我的代码:

C/C++ code
#include<iostream>using namespace std;#define lson l , m , root*2#define rson m+1 , r , root*2+1const int maxn = 55555;int sum[maxn * 4];void PushUp ( int root ) {    sum[root] = sum[ root * 2 ] + sum[ root * 2 + 1 ] ;}void build( int l , int r , int root ) {    if( l == r ) {        cin >> sum[root];        return ;    }    int m = ( l + r ) / 2 ;    build (lson);    build (rson);    PushUp(root);}void update ( int p , int add , int l , int r , int root ){    if( l == r ) {        sum[root] += add ;        return ;    }    int m = ( l + r ) / 2 ;    if ( p <= m ) update( p , add , lson );    else update( p , add , rson );    PushUp( root);}int query( int L , int R , int l , int r , int root){    if ( L <= l && R >= r )        return sum[root];    int m = ( l + r ) / 2 ;    int ret = 0 ;    if ( L <= m ) ret+=query(L , R , lson );    if ( R > m ) ret+= query( L, R , rson );    return ret ;}int main() {    int T , n ;    cin >> T ;    for ( int cas = 1 ; cas <= T ; cas++ ){        cout << "Case " << cas << ":\n";        cin >> n ;        build ( 1 , n , 1 ) ;        char op[10] ;        while ( cin >> op ) {            if ( op[0] == 'E')                break;            int a , b ;            cin >> a >> b ;            if( op[0] =='Q' )                cout << query(a,b,1,n,1) << endl ;            else if ( op[0] == 'S' )                update( a , -b , 1 , n , 1 );            else update( a, b, 1, n, 1 );        }    }    return 0;}


[解决办法]
我第一感觉是数据没清0。比如第一个数据是个完全二叉树,N=32768,第二个数据不满N=16385,那在算第二个数据的时候,sum末尾有一段是第二组数据计算的时候不用的,但是是非零的。
但说是说不用,你在PushUp的时候反而将那些算进去了。所以wa了。

不保证这是唯一的问题
[解决办法]
你把cin和cout比scanf和printf慢,把cin,cout换成scanf,printf。
去掉宏定义,在调用里,直接写。

读书人网 >软件架构设计

热点推荐