개인 노트
21271 단어 Python시합 프로그램 설계AtCodertech
감상
abc3 완료
나는 c점 상황을 고려하는 것이 매우 번거롭다고 생각해서 미루었다. 정말 미안하다
A - Square Inequality
문제에 따라
A, B, C = map(int, input().split())
if A ** 2 + B ** 2 < C ** 2:
print("Yes")
else:
print("No")
B - Intersection
질문문보다 x가 전부 A 이상이고 전부 B 이하의 숫자라면
따라서 A의 최대치 이상, B의 최저치 이하의 숫자 개수는
N = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
print(max(0, min(B) - max(A) + 1))
C - IPFL
질문별로 설치 후 TLE(완료)
따라서 고속화가 필요하다
T=1의 조회는 O(1)에서 조회할 수 있을 것 같아서 T=2를 빨리 하려고 합니다.
문자열 S의 전반부와 후반부는 두 변수로 관리된다
T=2의 검색어에서 이 두 개를 바꾸다
T=1의 검색에서 다음과 같이 두 개를 연결하고 A와 B를 교환하는 것이 비교적 쉽다. 이렇게 하면 TLE가 된다.
4
if T == 1:
S = first + last
S[a], S[b] = S[b], S[a]
first = S[:N]
last = S[-N:]
따라서 A와 B를 연결하지 않고 스왑A와 B가 각각 앞부분과 뒷부분을 표시하는 것을 주의하면서 교환하면 k
N = int(input())
S = list(input())
Q = int(input())
first = S[:N]
last = S[-N:]
for _ in range(Q):
t, a, b = map(int, input().split())
if t == 2:
first, last = last, first
continue
a, b = sorted([a - 1, b - 1])
if b + 1 <= N:
first[a], first[b] = first[b], first[a]
elif a + 1 <= N and N < b + 1:
first[a], last[b - N] = last[b - N], first[a]
else:
last[a - N], last[b - N] = last[b - N], last[a - N]
print("".join((first + last)))
D - RGB Coloring 2
스스로 설치할 수 없기 때문에 참고한 코드는 기본적으로 모두 복제된 것이다
각 연결 성분은 독립된 것 같기 때문에 각 연결 성분에 따라 고려한다.
DFS가 각 접속 구성 요소의 색상 조건을 충족하는 경우 이 솔루션을 사용할 수 있습니다.
따라서 DFS 구현을 고려합니다.
먼저 첫 번째 정점 i를 적당한 색깔로 칠한 다음에 인접한 정점을 조건으로 가득 칠한다.
i와 인접한 정점에는 i의 색을 제외한 두 가지 색의 선택이 있다.
이상의 중복은 각 정점에서 진행되기 때문에 계산량은 O(N\times2^N)로 매우 빠르다.
이번 도표는 간단한 도표로 폐쇄될 수 있다.
나무의 DFS처럼 어떤 정점에 접근했는지 관리하는 동시에 인접한 정점으로 이동하면 정점의 접근 순서는 다르지만 색의 칠법은 같은 상황을 반복한다.
이런 상황을 피하기 위해 정점의 바르는 순서를 고정시킨다.
참고 자료
def search_connect(n: int):
"""連結成分をDFSで探索
Args:
n (int): 頂点の番号
"""
seen[n] = True
connect.append(n)
for i in E[n]:
if seen[i]:
continue
search_connect(i)
return
def paint(con_i: int):
"""connect配列に含まれている頂点番号順に,頂点に色を塗っていく.
color配列は各頂点の色,インデックスは頂点の番号
Args:
con_i (int): connect配列のインデックス
Returns:
(int): 場合の数
"""
node_num = connect[con_i]
# 隣接する2頂点の色が重複していないかを確認
if any(color[node_num] == color[j] for j in E[node_num]):
return 0
# 全ての頂点に色を振り,重複してカウントしていないかを確認
if con_i == len(connect) - 1:
return 1
# 頂点に色を塗っていく順番がconnect配列によって一意に定まっているため,
# 次の頂点の色は必ず未定である0になっている.
# よって,次の色が既に塗られているかどうかといった判定は不要
res = 0
for j in (1, 2, 3):
color[connect[con_i + 1]] = j
res += paint(con_i + 1)
color[connect[con_i + 1]] = 0
return res
N, M = map(int, input().split())
E = [[] for _ in range(N)]
for _ in range(M):
a, b = map(lambda x: int(x) - 1, input().split())
E[a].append(b)
E[b].append(a)
ans = 1
seen = [False] * N
for i in range(N):
if seen[i]:
continue
# 連結成分を探索
connect = []
search_connect(i)
color = [0] * N
color[i] = 1
# 最初の色が何でもそれぞれの色での場合の数は一緒なので,1色の場合の数を3倍
ans *= paint(0) * 3
print(ans)
Reference
이 문제에 관하여(개인 노트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/m193h/articles/20210424sat233127m193habc199텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)