ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 23540 |
문제명 | Game with Dominoes |
레벨 | 플래티넘 2 |
분류 |
게임이론 |
시간복잡도 | O(nlogn) |
인풋사이즈 | n<=10^5 |
사용한 언어 | Python 3.13 |
제출기록 | 56604KB / 296ms |
최고기록 | 296ms |
해결날짜 | 2025/02/23 |
"""Solution code for "BOJ 23540. Game with Dominoes".
- Problem link: https://www.acmicpc.net/problem/23540
- Solution link: http://www.teferi.net/ps/problems/boj/23540
Tags: [game theory]
"""
import collections
import itertools
from teflib import disjointset
def main():
n, h_min, h_max = [int(x) for x in input().split()]
a = [int(x) for x in input().split()]
dsu = disjointset.DisjointSet(n)
inds_by_dist = collections.defaultdict(list)
grundy = n % 2
for i, (l, r) in enumerate(itertools.pairwise(sorted(a))):
if r - l < h_min:
s1, s2 = dsu.size(i), dsu.size(i + 1)
grundy ^= s1 ^ s2 ^ (s1 + s2)
dsu.union(i, i + 1)
elif r - l < h_max:
inds_by_dist[r - l].append(i)
if grundy == 0:
print(h_min)
return
answer = -1
for h, inds in sorted(inds_by_dist.items()):
for i in inds:
s1, s2 = dsu.size(i), dsu.size(i + 1)
grundy ^= s1 ^ s2 ^ (s1 + s2)
dsu.union(i, i + 1)
if grundy == 0:
answer = h + 1
break
print(answer)
if __name__ == '__main__':
main()