사용자 도구

사이트 도구


ps:problems:boj:1321

군인

ps
링크acmicpc.net/…
출처BOJ
문제 번호1321
문제명군인
레벨플래티넘 4
분류

구간 쿼리

시간복잡도O(n+mlogn)
인풋사이즈n<=500,000, m<=10,000
사용한 언어Python
제출기록84628KB / 436ms
최고기록436ms
해결날짜2021/04/21

풀이

  • 문제 설명이 좀 이해하기 어렵게 되어있는데, 이해하고 나면 간단한 k번째수 쿼리 문제가 된다.
  • 군인들의 부대 번호를 집합에 저장한다고 생각하자. 1번 부대에 4명, 2번 부대에 3명, 3번 부대에 2명이면 {1,1,1,1,2,2,2,3,3} 이런식.
  • 이제 i번 군인이 몇번 부대냐고 묻는 것은, 저 집합에서 i번째로 큰 수가 뭐냐고 묻는 것과 동일하다.
  • 부대의 감원과 증원은, 저 집합에서 i인 값을 a개 더하거나 빼는 것과 동일하다
  • 따라서 펜윅트리나 세그먼트 트리 기반의 Order Statistic Tree를 사용하면 쉽게 이 두가지 쿼리를 처리할 수 있다. 두가지 연산 모두 O(logn)에 처리된다
  • 전체 시간복잡도는 Order Statistic Tree를 구축하는데에 O(n), m개의 명령을 처리하는 데에 O(mlogn). 합쳐서 O(n+mlogn)이다

코드

"""Solution code for "BOJ 1321. 군인".

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

import sys
from teflib import fenwicktree


def main():
    N = int(sys.stdin.readline())  # pylint: disable=unused-variable
    soldiers = fenwicktree.OrderStatisticTree(
        int(x) for x in sys.stdin.readline().split())
    M = int(sys.stdin.readline())
    for _ in range(M):
        query = [int(x) for x in sys.stdin.readline().split()]
        if query[0] == 1:
            soldiers.add(query[1] - 1, query[2])
        else:
            print(soldiers.kth(query[1]) + 1)


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
P Q X R᠎ K
 
ps/problems/boj/1321.txt · 마지막으로 수정됨: 2021/05/28 16:15 저자 teferi