Java/실습

[Java] Segment Tree 구현

tmd1 2023. 3. 4. 19:01
import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);




    }
}

class SegmentTree{
    int N; //size
    int [] tree;

    int merge(int left, int right){
        return left+right; // sum
    }

    int buildRec(int [] arr, int node, int nodeLeft, int nodeRight){
        if(nodeLeft == nodeRight)
            return tree[node] = arr[nodeLeft];

        int mid = nodeLeft + (nodeRight-nodeLeft)/2;
        int leftVal = buildRec(arr, node*2, nodeLeft, mid);
        int rightVal = buildRec(arr, node*2+1,mid+1, nodeRight);

        return tree[node] = merge(leftVal, rightVal);
    }

    void build(int [] arr, int size){
        N = size;
        tree = new int[N*4];

        buildRec(arr,1,0,N-1);
    }

    int queryRec(int left, int right, int node, int nodeLeft, int nodeRight){
        if(right < nodeLeft || left > nodeRight)
            return 0;
        if(left <= nodeLeft && nodeRight <= right)
            return tree[node];

        int mid = nodeLeft + (nodeRight-nodeLeft)/2;
        return merge(queryRec(left,right,node*2,nodeLeft,mid),
                queryRec(left,right,node*2+1,mid+1,nodeRight));
    }

    int query(int left, int right){
        return queryRec(left,right,1,0,N-1);
    }

    int updateRec(int index, int newValue, int node, int nodeLeft, int nodeRight){
        if(index < nodeLeft || index > nodeRight)
            return tree[node];
        if(nodeLeft == nodeRight)
            return tree[node] = newValue;

        int mid = nodeLeft + (nodeRight-nodeLeft)/2;
        int leftVal = updateRec(index, newValue,node*2, nodeLeft, mid);
        int rightVal = updateRec(index, newValue,node*2+1,mid+1, nodeRight);
        return tree[node] = merge(leftVal,rightVal);
    }

    int update(int index, int newValue){
        return updateRec(index, newValue, 1, 0 ,N-1);
    }

}

 

 

https://www.youtube.com/watch?v=ahFB9eCnI6c&ab_channel=%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%98%81%EB%A7%A8