사용자 도구

사이트 도구


ps:problems:boj:10651

Cow Jog

ps
링크acmicpc.net/…
출처BOJ
문제 번호10651
문제명Cow Jog
레벨플래티넘 5
분류

LIS

시간복잡도O(nlogn)
인풋사이즈n<=100,000
사용한 언어Python
제출기록36652KB / 220ms
최고기록220ms
해결날짜2021/06/29

풀이

  • 같은 레인에서는 추월이 생기지 않는다는 것은 처음 순위가 그대로 유지된다는 것이고.. 처음 시점에서의 대소관계와 마지막 시점에서의 대소관계가 동일하다는 뜻이다. i번 소의 처음 포지션과 마지막 포지션을 x_i, y_i라고 두면, 같은 레인 안에 있는 소에 대해서는 x_1<x_2<…<x_k 이면 y_1<y_2<…<y_k 가 된다, 즉 x를 인덱스로 생각하면 y가 증가 수열을 이룬다.
  • 따라서 이 문제는 최소 몇개의 증가하는 부분 수열로 전체 수열을 커버할수 있는지를 묻는 문제가 되고, 최소 갯수의 non-increasing_subsequence 로 배열을 커버하기 에서 설명한대로 이것은 가장 긴 non-increasing_subsequence의 길이를 찾는 것과 동일한 문제가 된다.
  • non-increasing_subsequence는 가장 긴 증가하는 부분 수열 (Longest Increasing Subsequence / LIS)에서 설명한 대로 O(nlogn)에 계산 가능하다.

코드

"""Solution code for "BOJ 10651. Cow Jog".

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

Tags: [LIS]
"""

import bisect
import sys

MOD = 10_007


def main():
    N, T = [int(x) for x in sys.stdin.readline().split()]
    final_pos = []
    for _ in range(N):
        pos, speed = [int(x) for x in sys.stdin.readline().split()]
        final_pos.append(pos + speed * T)

    # Longest non-increasing sequence.
    arr = []
    for x in final_pos:
        lis_len = bisect.bisect_right(arr, -x)
        if lis_len == len(arr):
            arr.append(-x)
        else:
            arr[lis_len] = -x

    print(len(arr))


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
I D H W᠎ V
 
ps/problems/boj/10651.txt · 마지막으로 수정됨: 2021/06/29 16:30 저자 teferi