Segment Tree(线段树)

来源:互联网 发布:如何购买备案好的域名 编辑:程序博客网 时间:2024/05/29 17:38

线段树代码模板:

public class NumArray {Node root;int[] nums;    public NumArray(int[] nums) {    this.nums=nums;        if(nums.length>0){        root=build(root,0,nums.length-1);        }    }    public Node build(Node root,int left,int right){    if(left==right){    return new Node(left,right,nums[left]);    }    int mid=(left+right)/2;    root=new Node(left,right,0);    root.l=build(root.l,left,mid);    root.r=build(root.r,mid+1,right);    root.sum=root.l.sum+root.r.sum;    return root;    }    public void update(int i, int val) {    update(root,i,val);    }    public void update(Node root,int i,int val){    if(root.left==root.right&&root.left==i){    root.sum=val;return;    }    int mid=(root.left+root.right)/2;    if(i<=mid) update(root.l,i,val);    else update(root.r,i,val);    root.sum=root.l.sum+root.r.sum;    }    public int sumRange(int i, int j) {        return query(root,i,j);    }    public int query(Node root,int i,int j){    if(root.left==i&&root.right==j){    return root.sum;    }    int mid=(root.left+root.right)/2;    if(mid>=j) return query(root.l,i,j);    else if(mid<i){    return query(root.r,i,j);    }else{    return query(root.l,i,mid)+query(root.r,mid+1,j);    }    }}class Node{int left,right;Node l,r;int sum;public Node(int left, int right, int sum) {this.left = left;this.right = right;this.sum = sum;}}

原创粉丝点击