images/680b8a78e279aff797ecfe16d94e8c2c

Overview

Takeaway

  • 이번 대회에서 새로 배운 테크닉:
  • 내가 저지른 실수:
  • 다음에 비슷한 문제를 만나면 할 행동:

Problems

A - Maximum Neighborhood

  • 적당한 브론즈 구현 문제이다.
  • 격자의 각 칸마다 인접한 4칸의 숫자 합을 구해줘야 하는데, 이 과정에서 배열 초기화를 안 해주어 한 번 틀렸다. (1-based trick)

B - Addition on a Segment

  • [l, r] 구간에 1을 더하는 것을 정확히 nn번 반복하여, 주어진 길이 nn의 수열의 multiset과 같은 수열을 만들어낼 때, 사용된 구간의 길이의 최댓값을 최대화하는 문제이다.
  • 최대 길이를 cc라 두면, sumcn1sum-c \ge n-1, 따라서 csumn+1c \le sum-n+1이어야 한다.
  • 또한, cc는 nonzero element의 개수보다도 적거나 같아야 하고, 따라서 둘 중 최솟값을 출력하면 된다.

C - Quotient and Remainder

  • Q 배열과 R 배열이 주어졌을 때, x=yqi+rjKx = yq_{i}+r_{j} \le Kx,yx,y가 존재하면 (qi,rj)(q_{i}, r_{j})를 배열에서 제거할 수 있다.

  • 이때 가능한 최대 연산 횟수를 구하는 문제이다.

  • r_{j} < y이고, xx가 작으면 좋으므로 최적의 yyrj+1r_{j}+1이다. 따라서 (rj+1)qi+rjK(r_{j}+1)q_{i}+r_{j} \le K이면 두 원소를 제거할 수 있다.

  • 고정된 qq에 대해, rKqq+1r \le \frac{K-q}{q+1}이면 rr을 사용할 수 있고, 이때 최대의 rr을 사용하는 것이 유리하다.

  • qq가 커질수록 우변은 작아지므로, 큰 qq부터 가능한 최대 rr을 사용하는 전략이 유효하다.

D

  • solved by 0917ba
  • 업솔빙 예정

E - Binary Strings and Blocks

  • 문제를 잘 변형하면, 구간 mm개가 있고, 각 구간에 1이 적어도 하나는 등장하도록 길이 nn의 binary string을 구성하는 경우의 수를 세는 문제가 된다.

  • Sol 1)

  • 일단 쓸데없는 구간을 제거해서 정렬했을 때 구간의 양 끝이 단조 증가하도록 두자.

  • DP를 쓸 수 있을 것 같다. dp(i)dp(i): ii번째 구간부터 만족시키면서 채워갈 때의 경우의 수라 두자.

  • ii번째 구간에서 최초로 등장하는 1의 위치에 따라 케이스워크를 할 수 있다. O(N2)O(N^{2}) dp는 자명한데, 잘 생각해보면 펜윅 트리로 시간복잡도를 줄일 수 있는 꼴이다.

  • dp(1)=(2d11)dp(2)+(2d21)dp(3)++(2dk1)2(dk+1)dp(k+1)dp(1) = (2^{d_1}-1)dp(2) + (2^{d_2}-1)dp(3) + \cdots + (2^{d_k}-1)2^(d_{k+1})dp(k+1)과 같은 식이 나오는데, 마지막 항만 multiset으로 따로 처리해주면 된다.

  • Sol 2)

  • 선형에 풀 수 있는 방법이 있다. 주어진 제약 조건을 다른 방식으로 변형하는 것이다.

  • 구간 [l, r]에 1이 적어도 하나 존재한다는 것은, rr 이하의 i$$a(i)=1인 최대의 iill 이상이라는 뜻이다.

F

  • solved by 0917ba
  • 업솔빙 예정
Built with LogoFlowershow