목차

스터디 그룹

ps
링크acmicpc.net/…
출처BOJ
문제 번호14572
문제명스터디 그룹
레벨플래티넘 5
분류

투 포인터

시간복잡도O(nk)
인풋사이즈n<=100,000, k<=30
사용한 언어Python
제출기록76916KB / 2140ms
최고기록2140ms
해결날짜2021/09/17

풀이

코드

"""Solution code for "BOJ 14572. 스터디 그룹".

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

Tags: [TwoPointer]
"""

import sys
import typing


class Student(typing.NamedTuple):
    level: int
    algorithms: list[int]


def main():
    N, K, D = [int(x) for x in sys.stdin.readline().split()]
    students = []
    for _ in range(N):
        # pylint: disable=unused-variable
        M, d = [int(x) for x in sys.stdin.readline().split()]
        A = [int(x) for x in sys.stdin.readline().split()]
        students.append(Student(d, A))

    students.sort()
    answer = 0
    known_count_by_algo = [0] * K
    left_iter = iter(students)
    left = next(left_iter)
    group_size = 0
    for right in students:
        group_size += 1
        for algo in right.algorithms:
            known_count_by_algo[algo - 1] += 1
        while right.level - left.level > D:
            for algo in left.algorithms:
                known_count_by_algo[algo - 1] -= 1
            left = next(left_iter)
            group_size -= 1
        E = group_size * sum(1 for known_count in known_count_by_algo
                             if 0 < known_count < group_size)
        answer = max(answer, E)

    print(answer)


if __name__ == '__main__':
    main()