玄关求调!线段树板子题AC但过不了样例
查看原帖
玄关求调!线段树板子题AC但过不了样例
947202
wangruize88楼主2025/7/20 16:53

玄学的你谷之—— 过不了样例一却能AC
样例一代码输出7 6 7, 但应该为7 6 -1

#include <bits/stdc++.h>
using namespace std ;
typedef long long ll ;
ll a[1000010] , n , q ;
struct SegTree {
	#define lc(u) (2*u)
	#define rc(u) (2*u+1)
	ll maxn[4000010] , cov[4000010] , add[4000010] ;
	void build ( ll u , ll l , ll r ) {
		cov[u] = -1 , add[u] = 0 ;
		if ( l == r ) {
			maxn[u] = a[l] ;
			return ;
		}
		ll mid = (l+r)/2 ;
		build ( lc(u) , l , mid ) ;
		build ( rc(u) , mid+1 , r ) ;
		maxn[u] = max(maxn[lc(u)],maxn[rc(u)]) ;
	}
	void pushtag ( ll u , ll l , ll r , ll k , ll b ) {
		if ( k != -1 ) {
			maxn[u] = k+b ;
			cov[u] = k , add[u]= b ;
		} else {
			add[u] += b ;
			maxn[u] += b ;
		}
	}
	void pushdown ( ll u , ll l , ll r ) {
		if ( cov[u] == -1 && add[u] == 0 ) return ;
		ll mid = (l+r)/2 ;
		pushtag ( lc(u) , l , mid , cov[u] , add[u] ) ;
		pushtag ( rc(u) , mid+1 , r , cov[u] , add[u] ) ;
		add[u] = 0 , cov[u] = -1 ;
	}
	void change ( ll u , ll l , ll r , ll ql , ll qr , ll k , ll b ) {
		if ( ql <= l && r <= qr ) {
            pushtag ( u , l , r , k , b ) ;
            return ;
        }
		pushdown(u,l,r) ;
		ll mid = (l+r)/2 ;
		if ( ql <= mid ) change ( lc(u) , l , mid , ql , qr , k , b ) ;
		if ( qr > mid ) change ( rc(u) , mid+1 , r , ql , qr , k , b ) ;
		maxn[u] = max(maxn[lc(u)],maxn[rc(u)]) ;
	}
	ll query ( ll u , ll l , ll r , ll ql , ll qr ) {
		if ( ql <= l && r <= qr ) {
            return maxn[u] ;
        }
        pushdown ( u , l , r ) ;
		ll mid = (l+r)/2 , ans = -1e18 ;
		if ( ql <= mid ) ans = max(ans ,query ( lc(u) , l , mid , ql , qr )) ;
		if ( qr > mid ) ans = max(ans ,query ( rc(u) , mid+1 , r , ql , qr )) ;
		maxn[u] = max(maxn[lc(u)],maxn[rc(u)]) ;
		return ans ;
	}
	#undef lc
	#undef rc
}sgt;
int main () {
	ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0) ;
	cin >> n >> q ;
	for ( int i = 1 ; i <= n ; i ++ ) cin >> a[i] ;
	sgt.build(1,1,n) ;
	for ( int i = 1 , op , x , y , k ; i <= q ; i ++ ) {
		cin >> op >> x >> y ;
		if ( op == 1 ) {
			cin >> k ;
			sgt.change(1,1,n,x,y,k,0) ; 
		} else if ( op == 2 ) {
			cin >> k ;
			sgt.change(1,1,n,x,y,-1,k) ; 
		} else {
			cout << sgt.query(1,1,n,x,y) << '\n' ; 
		}
	}
	return 0 ;
}
2025/7/20 16:53
加载中...