2021. 2. 19. 14:08ㆍAlgorithm/Problem Solving
codeforces.com/contest/1486
총평: 전체적으로 문제 셋이 재밌었고 선방했다.
정확히 1달만에 즉흥적으로 친 코포라 걱정 반 설렘 반이였는데 오히려 더 나은 결과를 얻었다
A -> B -> C1 -> C2 -> E 순으로 풀었다.
A는 직관적으로 생각하면 쉬울 것을 너무 성급하게 찍어버렸다.
i -> i+1 단방향만 가능하므로 i=0->n-1까지 따라가면서 가능한지 검사하는게 중요 포인트
B는 수학. 무난히 빨리 풀었다.
C1, C2는 재미있는 인터랙티브 문제이니 꼭 풀어보는 것을 추천한다.
로그를 붙이는 다양한 알고리즘에 관하여 숙고한 경험이었다.
C1 구현에 오래 걸리고, C2는 자칫 못 풀 뻔 했지만
관점을 완전히 바꾸니 시간 투자 후 해결할 수 있었다.
E는 다익스트라 문제인데, 내가 푼 방법이 intended보다 더 빠르고 범용적이다.
a,b 타입 정점 모두 1번 정점에서부터의 거리로 pq에 집어넣는다. b타입의 정점의 경우 직전 간선의 가중치도 같이 저장해야 한다.
이때 a 타입 정점을 갱신할 조건은 거리, b 타입 정점을 갱신할 조건은 직전 간선의 가중치다.
이 다익스트라가 성립하는 이유는
b타입 정점을 살펴볼 때 항상
거리가 짧은 경우부터 보기 때문에
나중에 들어온 정점은 거리가 항상 더 크거나 같다.
이때 직전 간선의 가중치가 기존보다 크다면 이 정점은 더 이상 볼 필요가 없다.
w1<=w2, a<=b 일 때 w1 + (a+w)^2 <= w2 + (b+w)^2
따라서 w가 더 작을 경우에만 갱신되기 때문에 이 다익스트라가 성립한다.
w가 클 경우에도 될 줄 알았는데 지금 보니 w <= 50 이여서 O(M log 50N)에 돌아가는 거였다.
'Algorithm > Problem Solving' 카테고리의 다른 글
Cgiosy의 수학 코드 (0) | 2021.03.22 |
---|---|
Codeforces Round #704 Div.2 (0) | 2021.02.23 |
Solved.ac 경험치 시스템 개편 (2) | 2021.02.08 |
If you are a Newbie in Competitive Programming (3) | 2021.01.21 |
KOI에 등장하는 DP 문제들 #2 (1) | 2020.09.29 |