线段树题解做法求调qwq%%%
查看原帖
线段树题解做法求调qwq%%%
371901
zbhujiaqi楼主2022/11/20 18:12
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>

#define itn int ;

using namespace std ;

const int LONG = 50001 ;

int T , n , q ;
int origin[LONG] , End[LONG] ; 
int tmp[LONG] , Left[LONG] , Right[LONG] , num[LONG] ;

struct Segment_Tree {
	int l ;
	int r ;
	int lazy ;
	int MIN ;
	Segment_Tree()
	{
	    r = l = lazy = 0 ;
		MIN = 1e9 ; 
	} ;
}a[LONG] ;

inline void update(int k)
{
	a[k].MIN = min(a[k * 2].MIN , a[k * 2 + 1].MIN) ;
}

void build (int k , int l , int r)
{
	a[k].l = l ;
	a[k].r = r ;
	if(l == r)
	{
		a[k].MIN = End[l] ;
		return ;
	}
	int mid = (l + r) / 2 ;
	build(k * 2 , l , mid) ;
	build(k * 2 + 1 , mid + 1 , r) ;
	update(k) ;
}

void empty(int k , int l , int r)
{
	a[k].l = 0 ;
	a[k].r = 0 ;
	if(l == r)
	{
		a[k].MIN = 0 ;
		return ;
	}
	int mid = (l + r) / 2 ;
	empty(k * 2 , l , mid) ;
	empty(k * 2 + 1 , mid + 1 , r) ;
}

int Find_MIN(int k , int l , int r)
{
    if(a[k].l <= l && a[k].r >= r)
	{
		return a[k].MIN ;
	}	
	int mid = (a[k].l + a[k].r) / 2 ;
	int minn = 1e9 + 7 ;
	if(l <= mid)
	    minn = min(minn , Find_MIN(k * 2 , l , mid) ) ;
	if(r > mid)
	    minn = min(minn , Find_MIN(k * 2 + 1 , mid + 1 , r) ) ;
	return minn;		

}

void pushdown (int k)
{
	if(a[k].l == a[k].r )
	{
		a[k].lazy = 0 ; 
		return ; 
	}
	//if it is the final leaf , you needn't pushdown tags instead of cancel it ;
	
	a[k * 2].MIN -= a[k].lazy ; 
	a[k * 2 + 1].MIN -= a[k].lazy ;
	//change the k's leave' number ;
	a[k * 2].lazy += a[k].lazy ;
	a[k * 2 + 1].lazy += a[k].lazy ;
	a[k].lazy = 0 ;
}

void Subtract(int k , int l , int r , int x)
{
	if(a[k].l == l && a[k].r == r)
	{
		a[k].MIN -= x ;
		a[k].lazy += x ;
		return ;
	}
	int mid = (a[k].l +a[k].r) / 2 ;
	if(r <= mid)
	    Subtract(k * 2 , l , r , x) ;
	else if(l > mid)
	    Subtract(k * 2 + 1 , l , r ,x) ;
	else
	{
		Subtract(k * 2 , l , mid , x) ;
		Subtract(k * 2 + 1 , mid + 1 , r , x) ;
	}
	update(k) ;    
}

int main ()
{
    std::ios::sync_with_stdio(false);
    //freopen ( "xxx.in" , "r" , stdin) ;
    //freopen ( "xxx.out" , "w" , stdout) ;
    cin >> T ;
    for(int i = 1 ; i <= T ; i++)
    {
    	cin >> n >> q ;
    	for(int j = 1 ; j <= n ; j++)
		    cin >> origin[j] ;
    	
		for(int j = 1 ; j <= q ; j++)
    	{
    		cin >> tmp[j];
    		if(tmp[j] == 1)
			    cin >> Left[j] >> Right[j] >> num[j] ;
    		else
			    cin >> Left[j] >> Right[j] ;
		}
		
		for(int j = 1 ; j <= n ; j++)
		    cin >> End[j] ;
		    
		for(int i = q ; i > 0 ; i--)
	    {	
		    if(tmp[i] == 1)
    		{
	    		Subtract(1 , Left[i] , Right[i] , num[i]) ;
		    }
    		else
	    	{
		    	num[i] = Find_MIN(1 , Left[i] , Right[i]) ;
    		}
	    }
	 
    	for(int i = 1 ; i <= q ; i++)
	    {
		    if(tmp[i] == 2)
    		{
	    		cout << num[i] << " " ;
		    }
    	}
    	
    	for(int i = 1 ; i < n ; i++ )
    	{
    		origin[i] = 0 ;
    		End[i] = 0 ;
		}
    }
    
    //fclose (stdin) ;
    //fclose (stdout) ;
    return 0 ;
}


2022/11/20 18:12
加载中...