๋ฌธ์
https://www.acmicpc.net/problem/13168
๋ฐฑ์ค ๋ฌธ์ ์ง - 0x1C๊ฐ - ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ
์๊ณ ๋ฆฌ์ฆ: ๊ตฌํ, ์ต๋จ ๊ฒฝ๋ก, ํด์๋ฅผ ์ฌ์ฉํ ์งํฉ๊ณผ ๋งต, ํ๋ก์ด๋-์์
ํ์ด

๋ฐ์ดํฐ๋ฅผ ๋ฌธ์์ด ํํ๋ก ์ ์ฅํด์ผํด์ ๊ทธ๋ ์ง, ๋ฌธ์ ์์ฒด๋ ๋จ์ํ ํ๋ก์ด๋ ์์
๋ฌธ์ ๋ค.
๋ค๋ง ์ฃผ์ํด์ผํ ์กฐ๊ฑด์ด ์๋ค.
- 50% ํ ์ธ ์ฒ๋ฆฌ ์, ๊ฐ์ด ์ค์ํ์ผ๋ก ๋์ฌ ์ ์์ผ๋ฏ๋ก ๋ฏธ๋ฆฌ ์ฒ๋ฆฌํด์ค์ผํจ.
- ๋ฐฉ๋ฒ 1: ์ค์ํ์ผ๋ก ๊ณ์ฐ (
/) - ๋ฐฉ๋ฒ 2: ๋ชจ๋ ๋น์ฉ์ 2๋ฐฐ๋ก ์ทจ๊ธ -> 50% ํ ์ธ ์ ์ ์ํ์ผ๋ก ์ฒ๋ฆฌ๋จ
- ๋ฐฉ๋ฒ 1: ์ค์ํ์ผ๋ก ๊ณ์ฐ (
- ํฐ์ผ์ ์ค๊ฐ์ ๊ตฌ๋งคํ ๊ฒฝ์ฐ๋ ๋ฐ์ ธ์ผ ํจ.
- ์์๋์-๋์ฐฉ๋์ ๊ฐ์ ์ค๋ณต์ผ๋ก ์ฃผ์ด์ง ์ ์์. ์ต์๋น์ฉ์ผ๋ก ์ ์ฅํด์ผํจ.
์ฆ, ์ฌํ ๋์๊ฐ M๊ฐ๋ผ๋ฉด 1 ~ M-1 ๋ฒ์งธ์์ ํฐ์ผ์ ๊ตฌ๋งคํ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด์ผํ๋ค.
์คํ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์
๋ ฅ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- [์์๋์][๋์ฐฉ๋์] ๊ฐ์ด ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด, ๋น๊ต ํ ๋ ์์ ๊ฐ์ ์ ์ฅ
- ๊ธฐ๋ณธ ๊ฐ, ํฐ์ผ ๊ตฌ์
์์ ๊ฐ์ ๋ฐ๋ก ๋ถ๋ฆฌํ์ฌ ํ๋ก์ด๋ ์์
์ํ
- ์๋ฐฉํฅ์ผ๋ก ์ ์ฅ
- ๊ธฐ๋ณธ ๊ฐ(ํฐ์ผ X) ์ด ๋น์ฉ ๊ณ์ฐ
- ์ค๊ฐ์ ํฐ์ผ์ ๊ตฌ๋งคํ์ ๊ฒฝ์ฐ์ ์ด ๋น์ฉ ๊ณ์ฐ
- 1 ~ M-1๋ฒ์งธ ๋์(์ธ๋ฑ์ค ๊ธฐ์ค์ผ๋ก 0 ~ M-2)๋ฅผ ํ๋์ฉ ์ฒดํฌ
- (i๋ฒ์งธ ๋์๊น์ง ๊ธฐ๋ณธ์ผ๋ก ์ด๋ํ ๊ฐ + ํฐ์ผ๊ฐ) + (i+1 ~ M๋ฒ์งธ ๋์๊น์ง ํฐ์ผ์ผ๋ก ์ด๋ํ ๊ฐ) ๊ณ์ฐ
- ๊ธฐ์กด ๊ณ์ฐ๊ฐ๊ณผ ์๋ก์ด ๊ณ์ฐ๊ฐ์ ๋งค๋ฒ ๋น๊ตํด๊ฐ๋ฉฐ ์ต์๊ฐ ๊ฐฑ์
- 4๋ฒ์ ํตํด ์ป์ ์ต์๊ฐ(ํฐ์ผ O)๊ณผ, ๊ธฐ๋ณธ ๊ฐ์ ๋น๊ต
- ํฐ์ผ์ ์ฌ๋๊ฒ ๋ ํจ์จ์ ์ด๋ผ๋ฉด "Yes", ์๋๋ฉด "No" ์ถ๋ ฅ
์ ์ฒด ์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 33432KB / ์๊ฐ: 720ms
from sys import stdin
input = stdin.readline
INF = int(1e9)
N, R = map(int, input().split())
R *= 2
data = set(input().rstrip().split())
cities = {d: i for i, d in enumerate(data)}
M = int(input())
trip_cities = [cities[city] for city in input().rstrip().split()]
# ๐จ ๊ทธ๋ฅ ์ ์ ๋๋์
// ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ฉด ํ๋ฆผ...
# ํด๊ฒฐ๋ฐฉ๋ฒ 1. ์ค์ํ์ผ๋ก ๊ณ์ฐ, 2. 2๋ฐฐ ํด์ค๋ค // ์ฌ์ฉ
def calc(city, cost):
if city in ("Mugunghwa", "ITX-Saemaeul", "ITX-Cheongchun"):
return 0
if city in ("S-Train", "V-Train"):
return cost // 2
return cost
ticket = [[INF] * N for _ in range(N)]
normal = [[INF] * N for _ in range(N)]
K = int(input())
for _ in range(K):
T, S, E, cost = input().rstrip().split()
S, E = cities[S], cities[E]
cost = int(cost) * 2
ticket_cost = calc(T, cost)
ticket[S][E] = min(ticket_cost, ticket[S][E])
ticket[E][S] = min(ticket_cost, ticket[E][S])
normal[S][E] = min(cost, normal[S][E])
normal[E][S] = min(cost, normal[E][S])
for k in range(N):
for i in range(N):
for j in range(N):
ticket[i][j] = min(ticket[i][k] + ticket[k][j], ticket[i][j])
normal[i][j] = min(normal[i][k] + normal[k][j], normal[i][j])
# ํฐ์ผ์ ์ฌ์ง ์์์๊ฒฝ์ฐ์ ๋น์ฉ
normal_cost = sum(normal[trip_cities[i]][trip_cities[i+1]] for i in range(M-1))
# ์ค๊ฐ์ ํฐ์ผ์ ๊ตฌ๋งคํ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด์ ๊ณ์ฐํด์ผํจ.
def total_cost(start, cost):
for i in range(start, M-1):
cost += ticket[trip_cities[i]][trip_cities[i+1]]
return cost
min_cost = INF
curr_cost = 0
for start in range(M-1):
cost = total_cost(start, curr_cost) + R
min_cost = min(cost, min_cost)
curr_cost += normal[trip_cities[start]][trip_cities[start+1]]
print("Yes" if min_cost < normal_cost else "No")