zoukankan      html  css  js  c++  java
  • 线段树(Segment Tree)

    手写相关函数,在这总结一下。

    建立线段树

    void build_tree(int arr[],int tree[],int node,int start,int end){
    
    	if(start==end){
    		tree[node] = arr[start];//叶子节点
    	}
    	else{
    		int mid = (start + end)/2;
    		int left_node = 2*node + 1;
    		int right_node = 2*node + 2;
    		build_tree( arr, tree, left_node, start, mid);//递归建左子树
    		build_tree( arr, tree, right_node, mid+1, end);//递归建右子树
    		tree[node] = tree[left_node] + tree[right_node];//维护
    	}
    }
             
    

     

    更新某元素

    void update_tree(int arr[],int tree[],int node, int start, int end,int idx, int val){
    	 
    	 if(start == end){
    	 	arr[idx] = val;
    	 	tree[node] = val;
    	 }
    	 
    	 else{
    	 	int mid = (start + end)/2;
    	 	int left_node = 2*node +1;
    	 	int right_node = 2*node +2;
    	 	if(idx >= start &&idx <= mid){
    	 		update_tree( arr, tree, left_node, start, mid, idx, val);
    	 	}
    	 	else{
    	 		update_tree( arr, tree, right_node, mid+1, end, idx, val);
    	 	}
    	 	tree[node] = tree[left_node]+tree[right_node];
    	}
    }
    

      

    查询区间和

    int query_tree(int arr[], int tree[], int node, int start, int end, int L, int R){
    	if(R<start||L>end){
    		return 0;
    	}else if(start == end||start>=L&&end<=R){//这里如果没有后面的,则每次查询都会一直递归到叶子节点,降低效率
    		return tree[node];
    	}
    	else{
    	
    	
    		int mid = (start+end)/2;
    		int left_node = 2*node + 1;
    		int right_node = 2*node+2;
    		int sum_left = query_tree( arr, tree, left_node, start, mid, L, R);
    		int sum_right = query_tree( arr, tree, right_node, mid+1, end, L, R);
    		return sum_left+sum_right;
    	}
    

     

    区间操作(加法)

    void plus_tree(int arr[],int tree[],ll node,ll start,ll end,ll L,ll R,ll num){
    	if(start == end){
    		tree[node] += num;
    	}
    	else {
    		int mid = (start+end)/2;
    		int left_node = 2*node+1;
    		int right_node = 2*node+2;
    		if(L<=mid){
    			plus_tree(arr, tree, left_node, start, mid, L, R, num);
    		}
    		if (R>=mid+1){
    			plus_tree(arr, tree, right_node, mid+1, end, L, R, num);
    		}
    		
    		tree[node] = tree[left_node]+tree[right_node];
    	}
    }
    

      

     

  • 相关阅读:
    【算法•日更•第二十七期】基础python
    【算法•日更•第二十六期】非常基础的数论
    【算法•日更•第二十五期】万能算法(一):搜索+?
    【算法•日更•第二十四期】二分查找和二分答案的区别
    Hadoop学习9--动态增加datanode
    java-Spring-1
    Hadoop学习6--里程碑式的开始之执行第一个程序wordcount
    Hadoop学习5--配置本地开发环境(Windows+Eclipse)
    Hadoop学习4--安装Hadoop
    Hadoop学习3--安装ssh服务
  • 原文地址:https://www.cnblogs.com/ranbom/p/12209253.html
Copyright © 2011-2022 走看看