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()