OJ下最简单的一题线段树,但就是不知道为什么一直超时
OJ上最简单的一题线段树,但就是不知道为什么一直超时?
题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1166
希望有人看看,我实在找不出来哪里错了。
我的代码:
------解决方案--------------------
我第一感觉是数据没清0。比如第一个数据是个完全二叉树,N=32768,第二个数据不满N=16385,那在算第二个数据的时候,sum末尾有一段是第二组数据计算的时候不用的,但是是非零的。
但说是说不用,你在PushUp的时候反而将那些算进去了。所以wa了。
不保证这是唯一的问题
------解决方案--------------------
你把cin和cout比scanf和printf慢,把cin,cout换成scanf,printf。
去掉宏定义,在调用里,直接写。
题目地址:
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+1 const 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。
去掉宏定义,在调用里,直接写。