목차

디지털 비디오 디스크(DVDs)

ps
링크acmicpc.net/…
출처BOJ
문제 번호9345
문제명디지털 비디오 디스크(DVDs)
레벨플래티넘 3
분류

구간 쿼리

시간복잡도O(n+qlogn)
인풋사이즈n<=100,000, q<=50,000
사용한 언어Python
제출기록51920KB / 7240ms
최고기록7240ms
해결날짜2022/06/29
태그

[단계별]38단계, [라이]세그먼트 트리

풀이

코드

코드 1 - 최솟값 세그트리 + 구간합 펜윅트리

"""Solution code for "BOJ 9345. 디지털 비디오 디스크(DVDs)".

- Problem link: https://www.acmicpc.net/problem/9345
- Solution link: http://www.teferi.net/ps/problems/boj/9345
"""

import sys
from teflib import fenwicktree
from teflib import segmenttree


def main():
    T = int(sys.stdin.readline())
    for _ in range(T):
        N, K = [int(x) for x in sys.stdin.readline().split()]
        min_segtree = segmenttree.SegmentTree(range(N), merge=min)
        fenwick_tree = fenwicktree.FenwickTree(range(N))
        dvd_by_pos = list(range(N))
        for _ in range(K):
            Q, A, B = [int(x) for x in sys.stdin.readline().split()]
            if Q == 0:
                dvd_at_a, dvd_at_b = dvd_by_pos[A], dvd_by_pos[B]
                min_segtree.set(A, dvd_at_b)
                min_segtree.set(B, dvd_at_a)
                fenwick_tree.set(A, dvd_at_b)
                fenwick_tree.set(B, dvd_at_a)
                dvd_by_pos[A], dvd_by_pos[B] = dvd_at_b, dvd_at_a
            else:
                s = (A + B) * (B - A + 1) // 2
                if (fenwick_tree.query(A, B + 1) == s and
                        min_segtree.query(A, B + 1) == A):
                    print('YES')
                else:
                    print('NO')


if __name__ == '__main__':
    main()

코드 1 - 최솟값 세그트리 + 최댓값 세그트리

"""Solution code for "BOJ 9345. 디지털 비디오 디스크(DVDs)".

- Problem link: https://www.acmicpc.net/problem/9345
- Solution link: http://www.teferi.net/ps/problems/boj/9345
"""

import sys
from teflib import segmenttree


def main():
    T = int(sys.stdin.readline())
    for _ in range(T):
        N, K = [int(x) for x in sys.stdin.readline().split()]
        min_segtree = segmenttree.MinSegmentTree(range(N))
        max_segtree = segmenttree.MinSegmentTree(range(0, -N, -1))
        dvd_by_pos = list(range(N))
        for _ in range(K):
            Q, A, B = [int(x) for x in sys.stdin.readline().split()]
            if Q == 0:
                dvd_at_a, dvd_at_b = dvd_by_pos[A], dvd_by_pos[B]
                min_segtree.set(A, dvd_at_b)
                min_segtree.set(B, dvd_at_a)
                max_segtree.set(A, -dvd_at_b)
                max_segtree.set(B, -dvd_at_a)
                dvd_by_pos[A], dvd_by_pos[B] = dvd_at_b, dvd_at_a
            else:
                if (-max_segtree.query(A, B + 1) == B and
                        min_segtree.query(A, B + 1) == A):
                    print('YES')
                else:
                    print('NO')


if __name__ == '__main__':
    main()