Post

Educational Codeforces Round 154 (Rated for Div. 2)

Educational Codeforces Round 154 (Rated for Div. 2)

8월 31일 진행한 에듀케이셔널 코드포스 154번 대회 일지입니다.
이번에도 4문제를 30분만에 풀어내고 E번을 풀지 못했습니다. 레이티드 4솔 중 5등 정도 한 것 같습니다.

0:00~0:02

  • A번 Prime Deletion을 잡았습니다.
  • 발상 1(1분): 13이나 31 중 하나는 무조건 발견됩니다. 1이 먼저 오는지 3이 먼저 오는지 구분하면 됩니다.
  • 빠르게 풀었습니다.

0:02~0:08

  • B번 Two Binary Strings를 잡았습니다.
  • 각 string이 0으로 시작해 1로 끝난다는 사실(문제 조건)을 2분 후에 발견했습니다.
  • 가정 1(3분): 두 string의 같은 위치에서 ‘01’이라는 substring이 나오면 YES, 아니면 NO입니다. YES 쪽이 가능함은 자명하며, substring이 발견되지 않을 때 NO임을 증명해야 합니다.
  • 발상 1 (4분): 두 string을 0..01..10..01..1으로 줄일 수 있다고 합시다. 그러면 두 string 모두를 0..01..1으로 줄일 수 있습니다. 따라서, 두 string을 같게 만들 수 있다면 두 string을 모두 0..01..1 꼴의 같은 string으로 줄일 수 있습니다.
  • 이제 다음과 같은 증명이 필요합니다: “0..01..1으로 줄일 수 있는 모든 string은 0..01..1으로 한 번에 줄일 수 있다.” 그러나 약간의 직관과 함께 여기까지의 발상이면 이는 거의 사실일 것이라 생각했고, 따라서 증명하지 않고 구현해서 맞았습니다.

0:08~0:18

  • C번 Queries for the Array를 잡았습니다.
  • 1이 나올 경우 그곳까지의 string과 모든 prefix은 무조건 정렬되어 있습니다. 0이 나올 경우 적어도 그곳까지의 string과 일부의 긴 prefix는 정렬되어 있지 않습니다.
  • 따라서, 1이 나올 때마다 그곳까지의 string이 정렬되어 있다는 사실을 표기하고 0이 나올 때마다 그곳과 그 오른쪽의 prefix는 정렬되어 있지 않다는 사실을 표기하면 됩니다.
  • 이때, 정렬되어 있지 않은 string의 길이가 2 미만이거나 정렬되어 있는 칸의 수보다 작거나 같은 경우가 유일하게 NO를 출력해야 하는 경우입니다. 이외의 경우 무조건 YES를 출력합니다.
  • 발상 자체에는 얼마 걸리지 않았고, 구현 문제였습니다. 10분 정도 걸려 맞았습니다.

0:18~0:29

  • D번 Sorting By Multiplication을 잡았습니다.
  • 발상 1(2분): 음수가 곱해지지 않는 경우, 그냥 증가하는 수열을 잘 만들면 됩니다. 이때 다음을 가정합니다: $a_i \geq a_{i+1}$인 i의 개수가 최소 동작 횟수이다.
  • 증명 1(3분): $a_i \geq a_{i+1}$인 i에 대해, 이를 증가하도록 만드려면 어떠한 수를 $a_i$에는 곱하지 않고 $a_{i+1}$에는 곱해야 합니다.
  • 발상 2(5분): 음수가 생기는 경우, 왼쪽의 몇 개의 수에 대해 -1을 곱한 뒤 발상 1을 역순으로 적용하면 됩니다.
  • 발상 3(6분): 발상 1의 개수는 prefix/suffix에서 계산하여 부분 합으로 나타낼 수 있습니다. 이를 $O(n)$에 계산해 두면 양/음의 경계가 어디인지에 따라서 각각을 증가하도록 만드는 경우의 수를 $O(1)$에 구할 수 있습니다. 따라서 풀이가 가능합니다.
  • 구현했고, 맞았습니다. 당시 순위는 30등 정도였습니다.

0:29~1:40

  • E번 Non-Intersecting Subpermutations을 잡았습니다.
  • 발상 1: 길이 r, subpermutation이 t개인 문자열의 개수를 길이 r-1, subpermutation이 t개인 문자열의 개수와 그 이전의 값들을 이용해 멋진 DP+포배로 구할 수 있다고 생각했습니다.
  • 그 이후로 진전이 없습니다. 못 풀었습니다.

후기

  • 쉬운 문제 발상력은 정말 좋은 것 같습니다. 어려운 문제를 1시간 이내에 풀 수 있는 능력이 필요합니다.
  • 퍼플에 6번째 왔습니다. 이번에는 좀 안 떨어지면 좋겠습니다.
This post is licensed under CC BY 4.0 by the author.