WonYong-Jang / algorithm

0 stars 0 forks source link

트리 / Lazy Propagation / Persistent Segment Tree / sqrt Decomposition #15

Open WonYong-Jang opened 6 years ago

WonYong-Jang commented 6 years ago

Segment Tree / Index Tree

백준 관련 문제 2042, 10868, 2357 ( 구간 합, 곱, 최대 최소 구할때 )

트리 시작점

트리 구성

구간 값 구하기

2018-09-11 3 44 20

구간 합 구하기

2018-10-04 10 32 56

참고 문제

2018-09-11 2 40 44
WonYong-Jang commented 5 years ago

추천문제 확인 !

https://m.blog.naver.com/kks227/220791986409

https://lyzqm.blogspot.com/2017/07/segment-tree-3653.html

WonYong-Jang commented 5 years ago

응용문제

6539 히스토그램에서 가장 큰 직사각형

1280 나무 심기 ( 다시 풀기 )

12016 라운드 로빈 ( 다시 풀기 )

3392 화성지도

WonYong-Jang commented 5 years ago

세그먼트 트리 with Lazy Propagation

게으른 전파(Lazy Propagation)은 노드의 업데이트를 매 번 리프 노드까지 전부 수행하지 않고,

필요할 때에만 함으로써 하나의 자료뿐만 아니라 구간 내의 자료들 전부를 업데이트 하는 연산마저 O(logN)에 수행 가능

게으르게 전파 시키자

구간합 2

public static long sum(int node, int start, int end, int i, int j)
{
    if(tree[node].lazy != 0 )
    {
        tree[node].num += (end - start + 1)*tree[node].lazy;
        if(start != end)
        {
            tree[node*2].lazy += tree[node].lazy;
            tree[node*2+1].lazy += tree[node].lazy;
        }
        tree[node].lazy = 0;
    }

    if(i > end || j < start) return 0;
    else if(i <= start && end <= j)
    {
        return tree[node].num;
    }
    else
    {
        int mid = (start + end) / 2;
        return sum(node*2, start, mid, i, j) + sum(node*2+1, mid+1, end, i, j);
    }
}
public static void update(int node, int start, int end, int i, int j, long value)
{
    if(tree[node].lazy != 0)
    {
        tree[node].num += (end - start + 1)*tree[node].lazy;
        if(start != end)
        {
            tree[node*2].lazy += tree[node].lazy;
            tree[node*2+1].lazy += tree[node].lazy;
        }
        tree[node].lazy =0;
    }

    if(i > end || j < start) return;
    else if(i <= start && end <= j)
    {
        tree[node].num += ( end - start + 1)*value;
        if(start != end)
        {
            tree[node*2].lazy += value;
            tree[node*2+1].lazy += value;
        }
        return;
    }
    else
    {
        int mid = (start + end) / 2;
        update(node*2, start, mid, i, j, value);
        update(node*2+1, mid+1, end, i, j, value);
        tree[node].num = tree[node*2].num + tree[node*2+1].num;
    }
}

참고 링크 : https://bowbowbow.tistory.com/4

WonYong-Jang commented 5 years ago

Persistent Segment Tree

참고 링크 : http://blog.naver.com/PostView.nhn?blogId=kks227&logNo=221411526404&parentCategoryNo=&categoryNo=299&viewDate=&isShowPopularPosts=true&from=search

WonYong-Jang commented 5 years ago

모스 알고리즘

Sqrt Decomposition 방법 이용

모든 쿼리 Q = (s, e)에 대해, ([s/√N], e) 순으로 오름차순 정렬

구간 합 구하기

링크 : http://blog.naver.com/PostView.nhn?blogId=kks227&logNo=221401154455&parentCategoryNo=&categoryNo=315&viewDate=&isShowPopularPosts=true&from=search