线段树18pts求调!
查看原帖
线段树18pts求调!
950927
_luo_gu楼主2024/3/17 13:52

以下代码:

#include <bits/stdc++.h>
#define int long long
#define lson ( pos << 1 )
#define rson ( pos << 1 | 1 )
using namespace std ;
int n , m , ll , rr , k , a[1000005] ;
struct SegTree{
	int max ;//区间最大子段和 
	int maxl ;//包含左端点最大子段和 
	int maxr ;//包含右端点最大字段和 
	int sum ;//区间和 
};
SegTree tre[2400005] ;
void pushup( int pos ){
	tre[pos].sum = tre[lson].sum + tre[rson].sum ;
	tre[pos].maxl = max ( tre[lson].maxl , tre[lson].sum + tre[rson].maxl );
	tre[pos].maxr = max ( tre[rson].maxr , tre[rson].sum + tre[lson].maxr );
	if( tre[lson].maxr < 0 && tre[rson].maxl < 0 ){
		tre[pos].max = max( tre[lson].maxr , tre[rson].maxl );
	}else{
		tre[pos].max = max( max( tre[lson].maxr , tre[rson].maxl) , max( max( (tre[lson].sum + tre[rson].maxl ) , tre[rson].sum + tre[lson].maxr) , tre[lson].maxr + tre[rson].maxl));
	}
	return ;
}
void build( int pos , int l , int r ){
	if( l == r ){
		tre[pos].sum = a[l] ;
		tre[pos].maxl = a[l] ;
		tre[pos].maxr = a[l] ;
		tre[pos].max = a[l] ;
		return ;
	}
	int mid ;
	mid = ( l + r ) >> 1 ;
	build( lson , l , mid ) ;
	build( rson , mid+1 , r );
	pushup( pos );
	return ;
}
void update( int pos , int l , int r , int p , int s){
	if( l == r ){
		tre[pos].max = s ;
		tre[pos].maxl = s ;
		tre[pos].maxr = s ;
		tre[pos].sum = s ;
		return ;
	}
	int mid ;
	mid = ( l + r ) >> 1 ;
	if( p <= mid ){
		update( lson , l , mid , p , s );
	}else{
		update( rson , mid+1 , r , p , s );
	}
	pushup( pos );
	return ;
}
SegTree query( int pos , int l , int r , int ql , int qr ){
	if( ql <= l && qr >= r ){
		return tre[pos] ;
	}
	int mid ;
	mid = ( l + r ) >> 1 ;
	if( ql <= mid && mid < qr ){
		SegTree res , resl , resr ;
		resl = query( lson , l , mid , ql , qr );
		resr = query( rson , mid+1 , r , ql , qr );
		res.maxl = max( resl.maxl , ( resl.sum + resr.maxl ));
		res.maxr = max( resr.maxr , ( resr.sum + resl.maxr ));
		res.max = max( (resl.maxr + resr.maxl) , max( resl.max , resr.max ));
		return res ;
	}else{
		if( ql <= mid ){
			return query( lson , l , mid , ql , qr );
		}else{
			return query( rson , mid+1 , r , ql , qr );
		}
	}
}
signed main(){
	scanf("%lld%lld" , &n , &m );
	for( int i = 1 ; i <= n ; ++ i ){
		scanf( "%lld" , &a[i] );
	}
	build( 1 , 1 , n );
	for( int i = 1 ; i <= m ; ++ i ){
		scanf( "%lld%lld%lld" , &k , &ll , &rr );
		if( k == 1 ){
			if( ll > rr ){
				swap( ll , rr );
			}
			SegTree
			ans = query( 1 , 1 , n , ll , rr );
			cout << ans.max << endl;
		}
		if( k == 2 ){
			update( 1 , 1 , n , ll , rr );
		}
	}
	return 0 ;
}

感谢大佬!好人一生平安!

2024/3/17 13:52
加载中...