全wa的线段树求调
查看原帖
全wa的线段树求调
221551
Bker_楼主2022/8/10 00:42

rt

#include <iostream>
using namespace std;
#define ll long long

const int maxn = 100010 ;

ll a[maxn * 4] , w[maxn * 4] , lzy[maxn * 4];

void pushup(const int x){
	w[x] = w[2 * x] + w[2 * x + 1] ;
}
//建树 
void build(const int u , int l , int r){//u意思为树上的某个节点 
	if(l == r){
		w[u] = a[l] ;
		return ;
	}
	int M = (l + r) / 2 ;	
	build((2 * u) , l , M) ;
	build((2 * u) + 1 , M + 1, r) ;
	pushup(u) ;
}

//ll quarry1(int u , int l , int r , int p){//单点 
//	if(l == r)
//		return w[u] ;
//	else{
//		int M = (l + r) >> 2 ;
//			if(M >= p)
//				return quarry1(u * 2 , l , M , p) ;
//			else 
//				return quarry1(u * 2 + 1 , M + 1 , r , p) ;
//	}
//}

//void updata1(int u , int l , int r , int p , ll x){//单点 
//	if(l == r)
//		w[u] = x ;	
//	else{
//		int M = (l + r) >> 2 ;
//			if(M >= p)
//				updata1(u * 2 , l , M , p , x) ;
//			else 
//				updata1(u * 2 + 1 , M + 1 , r , p , x) ;	
//		pushup(x);
//	}
//}

bool inrange(int L , int R , int l , int r){
	return (l <= R) && (L <= l) ;	
}

bool outrange(int L , int R , int l , int r){
	return (L > r) || (R < l) ;
}

void maketage(int u , int len , ll x){
	lzy[u] += x ;
	w[u] += len * x ; 
}

void pushdown(int u , int l , int r){
	int M = (l + r) / 2 ;
	maketage(2 * u , M - l + 1 , lzy[u]) ;
	maketage(2 * u + 1, r - M , lzy[u]) ;
	lzy[u] = 0 ;
}

ll quarry(int u , int L , int R , int l , int r){//L R 是所求求区间 
	if(inrange(L , R , l , r))
		return w[u] ;
	else if(!outrange(L , R , l , r)){
		int M = (L + R) / 2 ;
		pushdown(u , L , R) ;
		return quarry(2 * u , L , M , l , r) + quarry(2 * u + 1 , M + 1 , R , l , r);
	}else return 0 ;
}

void updata(int u , int L , int R , int l , int r , ll x){
	if(inrange(L , R , l , r))
		maketage(u , R - L + 1 , x) ;
	else if(!outrange(L , R , l , r)){
		int M = (L + R) / 2 ;
		pushdown(u , L , R) ;
		updata(u * 2 , L , M  , l , r , x) ; 
		updata(u * 2 + 1 , M + 1, R , l , r , x) ;
		pushup(u) ;
	}
}

int main(){
	int n , m ; 
	cin>>n>>m ;
	for(int i = 1; i <= n ; i++)
		cin>>a[i] ;
	build(1 , 1 , n) ;
	for(int t = 1 ; t <= m ; t++){
		int op , x , y ;
		ll k ;
		cin>>op ;
		if(op == 1){
			cin>>x>>y>>k;
			updata(1 , 1 , n , x , y , k);
		}else if(op == 2){
			cin>>x>>y;
			cout<<quarry(1 , 1 , n , x , y) <<endl;
		}
	}
	return 0 ; 
}
2022/8/10 00:42
加载中...