2022 ์ผ์ฑ ํ๋ฐ๊ธฐ ๊ณต์ฑ ๊ธฐ์ถ๋ฌธ์
๋งํฌ๋ ๋ฆฌ์คํธ๋ก ํ์ด์ผํ๋ค๋ ๊ฑด ์๊ฒ ๋๋ฐ ์ฝ๋๋ฅผ ํจ์จ์ ์ผ๋ก ์ง๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ด์ ์ ๋ต ์ฝ๋๋ก ๊ณต๋ถํ๋ค๐
q = int(input())
n, m = -1, -1 # n๊ฐ์ ๋ฒจํธ, m๊ฐ์ ๋ฌผ๊ฑด
prev, next = [0] * 100001, [0] * 100001 # id์ ํด๋นํ๋ ์์์ prev, next๊ฐ
head, tail, num = [0] * 100001, [0] * 100001, [0] * 100001 # ๊ฐ ๋ฒจํธ ๋ณ head id, tail id, ์ ๋ฌผ ์
# 1) ๊ณต์ฅ ์ค๋ฆฝ
def build(order):
n, m = order[1], order[2]
belt = [[] for i in range(n)]
for i in range(1, m+1):
belt[order[i+2]-1].append(i)
for i in range(n):
if len(belt[i]) == 0:
continue
head[i] = belt[i][0]
tail[i] = belt[i][-1]
num[i] = len(belt[i])
for j in range(len(belt[i])-1):
next[belt[i][j]] = belt[i][j+1]
prev[belt[i][j+1]] = belt[i][j]
# 2) ๋ฌผ๊ฑด ๋ชจ๋ ์ฎ๊ธฐ๊ธฐ
def move(order):
src, dst = order[1] - 1, order[2] - 1
# src์ ๋ฌผ๊ฑด์ด ์๋ค๋ฉด ๊ทธ๋๋ก dst๋ด ๋ฌผ๊ฑด ์๊ฐ ๋ต์ด ๋จ
if num[src] == 0:
print(num[dst])
return
# dst์ ๋ฌผ๊ฑด์ด ์๋ค๋ฉด ๊ทธ๋๋ก ์ฎ๊ฒจ์ค
elif num[dst] == 0:
head[dst] = head[src]
tail[dst] = tail[src]
else:
dh = head[dst]
head[dst] = head[src]
st = tail[src]
next[st] = dh
prev[dh] = st
head[src], tail[src] = 0, 0
num[dst] += num[src]
num[src] = 0
print(num[dst])
# ํด๋น ๋ฒจํธ์ head๋ฅผ ์ ๊ฑฐํจ
def remove(idx):
# ํด๋น ๋ฒจํธ๊ฐ ๋น์ด์์ ๊ฒฝ์ฐ ๋ถ๊ฐ๋ฅํจ -> 0 ๋ฆฌํด -> ๋ค์ push ํจ์์์ ์ด์ด์ง
if num[idx] == 0:
return 0
# ํด๋น ๋ฒจํธ ๋ด ์ ๋ฌผ ๊ฐ์๊ฐ 1๊ฐ๋ผ๋ฉด -> head, tail ์ ๋ถ ์ญ์
if num[idx] == 1:
hid = head[idx]
head[idx], tail[idx] = 0, 0
num[idx] = 0
return hid
hid = head[idx] # ์ ๊ฑฐ๋ head๊ฐ
nh = next[hid] # ๋ฐ๋ head๊ฐ
next[hid], prev[nh] = 0, 0
num[idx] -= 1
head[idx] = nh
return hid
# ํด๋น ๋ฒจํธ์ head๋ฅผ ์ถ๊ฐํจ
def push(idx, nh):
# ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์งํํ์ง ์์
if nh == 0:
return
# ํด๋น ๋ฒจํธ๊ฐ ๋น์ด์์ ๊ฒฝ์ฐ -> head, tail์ด ๋์์ ์ถ๊ฐ๋จ
if num[idx] == 0:
head[idx], tail[idx] = nh, nh
num[idx] = 1
else:
hid = head[idx] # ์๋์ head๊ฐ -> ์ถ๊ฐํ ๋ค์๋ nh-hid์์ด ๋จ
next[nh] = hid
prev[hid] = nh
head[idx] = nh
num[idx] += 1
# 3) ์ ๋ฌผ๊ฑด๋ง ๊ต์ฒดํ๊ธฐ
def change(order):
src, dst = order[1] - 1, order[2] - 1
sh = remove(src)
dh = remove(dst)
push(dst, sh)
push(src, dh)
print(num[dst])
# 4) ๋ฌผ๊ฑด ๋๋๊ธฐ
def divide(order):
src, dst = order[1] - 1, order[2] - 1
cnt = num[src]
bid = []
# src์์ cnt//2๊ฐ๋งํผ ์ ๋ฌผ๋ค์ ๋นผ์ค
for _ in range(cnt//2):
bid.append(remove(src))
# ๊ฑฐ๊พธ๋ก ๋ค์ง์ด์ ํ๋์ฉ dst์ ์ ๋ฌผ๋ค์ ๋ฃ์ด์ค
for i in range(len(bid)-1, -1, -1):
push(dst, bid[i])
print(num[dst])
# 5) ์ ๋ฌผ ์ ๋ณด ์ป๊ธฐ
def gift(order):
pnum = order[1]
if prev[pnum] != 0:
a = prev[pnum]
else:
a = -1
if next[pnum] != 0:
b = next[pnum]
else:
b = -1
print(a + 2 * b)
# 6) ๋ฒจํธ ์ ๋ณด ์ป๊ธฐ
def belt(order):
bnum = order[1] - 1
if head[bnum] != 0:
a = head[bnum]
else:
a = -1
if tail[bnum] != 0:
b = tail[bnum]
else:
b = -1
c = num[bnum]
print(a + 2 * b + 3 * c)
for _ in range(q):
order = list(map(int, input().split()))
if order[0] == 100:
build(order)
elif order[0] == 200:
move(order)
elif order[0] == 300:
change(order)
elif order[0] == 400:
divide(order)
elif order[0] == 500:
gift(order)
else:
belt(order)
ในใ
๋นก๊ตฌํ
์ํ์ฅ์์ ๋ณด๋ฉด ๋ฉ๋ถ์ฌ๋ฏ..
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ํํ ์ง๋ ๊ฒ์ฒ๋ผ [prev, next] ์ด๋ฐ ์์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ ์๋๋ผ prev, next, head, tail, num ๋ฐฐ์ด์ ๊ฐ๊ฐ ๋ง๋ค์ด ์ฃผ๋ ๊ฒ ์ธ์์ ์ด์๋ค
์ฌ์ค ์ฒ์์ [prev, next]๋ง ์ธ ๋๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ด์ ์ด ์ ๋ณด์ด๊ธด ํ๋ค
โ
1) ๊ณต์ฅ ์ค๋ฆฝ -> ์ด๊ธฐํ ๊ณผ์
โ
2) ๋ฌผ๊ฑด ๋ชจ๋ ์ฎ๊ธฐ๊ธฐ
src๋ฒ์งธ ๋ฒจํธ์ ์๋ ์ ๋ฌผ๋ค์ ๋ชจ๋ dst๋ฒ์งธ ๋ฒจํธ๋ก ์ฎ๊น (head, tail, prev, next ๋ฆฌ์คํธ ์ฌ์ฉ)
dst๋ฒ์งธ ๋ฒจํธ์ ์๋ ์ ๋ฌผ๋ค์ ๊ฐ์ ์ถ๋ ฅ (num ๋ฆฌ์คํธ)
โ
3) ์ ๋ฌผ๊ฑด๋ง ๊ต์ฒดํ๊ธฐ
src๋ฒ์งธ ๋ฒจํธ์ ์๋ ๋งจ ์ ์ ๋ฌผ๊ณผ dst๋ฒ์งธ ๋ฒจํธ์ ์๋ ๋งจ ์ ์ ๋ฌผ์ ๊ต์ฒด
dst๋ฒ์งธ ๋ฒจํธ์ ์๋ ์ ๋ฌผ๋ค์ ๊ฐ์ ์ถ๋ ฅ (num ๋ฆฌ์คํธ)
๊ต์ฒด ์์
-> ์ญ์ , ์ถ๊ฐ ์์
ํ์
โ
4) ๋ฌผ๊ฑด ๋๋๊ธฐ
src๋ฒ์งธ ๋ฒจํธ์์ ๋งจ์๋ถํฐ cnt//2๋ฒ์งธ ์ ๋ฌผ๊น์ง dst๋ฒ์งธ ๋ฒจํธ๋ก ์ฎ๊น
dst๋ฒ์งธ ๋ฒจํธ์ ์๋ ์ ๋ฌผ๋ค์ ๊ฐ์ ์ถ๋ ฅ (num ๋ฆฌ์คํธ)
์ฒ์๋ถํฐ cnt//2๋ฒ์งธ๊น์ง ์ ๋ฌผ ๋นผ์ค -> ์ญ์ ์์
๋บ ์ ๋ฌผ์ dst๋ฒ์งธ ๋ฒจํธ์ ๋ํด์ค -> ์ถ๊ฐ ์์
-> 3, 4๋ฒ์์ ๊ณตํต์ผ๋ก ์ถ๊ฐ/์ญ์ ์์
์ ํ๋ฏ๋ก ์ถ๊ฐ/์ญ์ ํจ์๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ค
โ
5) ์ ๋ฌผ ์ ๋ณด ์ป๊ธฐ
p_num ์ ๋ฌผ์ ์ ์ ๋ฌผ์ a(prev ๋ฆฌ์คํธ), ๋ค ์ ๋ฌผ์ b(next ๋ฆฌ์คํธ)๋ผ๊ณ ํ ๋, a + 2 b๊ฐ์ ์ถ๋ ฅํจ
โ
6) ๋ฒจํธ ์ ๋ณด ์ป๊ธฐ
b_num ๋ฒจํธ์ ๋งจ ์์ ์๋ ์ ๋ฌผ ๋ฒํธ๋ฅผ a(head ๋ฆฌ์คํธ), ๋งจ ๋ค์ ์๋ ์ ๋ฌผ ๋ฒํธ๋ฅผ b(tail ๋ฆฌ์คํธ)๋ผ๊ณ ํ ๋, a + 2 b + 3 * c๋ฅผ ์ถ๋ ฅํจ
โ
์ฝ๋ ์ด๊ธฐ ์ค๊ณ๊ฐ ์ค์ํ๋ ๋ฌธ์