Notice
Recent Posts
Recent Comments
Link
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

jay153의 PS 일지

CodeForces Educational Round 177 본문

CodeForces

CodeForces Educational Round 177

jay153 2025. 5. 13. 12:30

https://codeforces.com/contest/2086

 

 

Performance Rating : 2850

 

A

$n$을 입력받고 $2n$을 출력하는 문제였다.

 

B

$r$은 $nk$에 고정해 두고 가능한 $l$의 최댓값을 구하면 된다. 반복이 된다는 점을 활용하여 $b_l+\cdots+b_{nk}\geq x$인 $l$의 최댓값을 구했다.

 

C

관찰을 하다가 특정 숫자를 고치기 시작하면 순열 사이클 분할을 해놓은 모든 숫자들을 다 고쳐야 한다는 것을 알게 되었다. 쿼리별로 입력을 받은 뒤 이미 끝난 숫자라면 답을 출력하고 아니라면 순열 사이클을 찾아 개수를 답에 더해주었다.

 

D

홀수 인덱스를 가진 부분과 짝수 인덱스를 가진 부분이 정확히 분리되어 있다는 생각을 했다. 우선 알파벳들의 분배를 적절히 잘했을 경우 각 분배별로 몇 가지의 경우의 수가 있는지 관찰을 했다. 알파벳 분배 별 경우의 수는 $ \frac{((n+1)/2)!(n/2)!}{\prod c_i!}$라는 것을 확인한 뒤 분배의 경우의 수를 $dp$로 구할 생각을 했다. 분배의 경우의 수는 두 그룹의 알파벳 개수 차이를 바탕으로 $dp$를 통해 구했다.

 

E

1부터 $r$까지의 답을 구하는 함수를 구하고 $cnt(r, x)-cnt(l - 1, x)$을 통해 답을 구하면 되겠다는 생각이 먼저 들었다. 이제 $calc(r, x)$를 어떻게 구할지 생각을 하면서 관찰해 보니 큰 것을 사용할 수 있다면 무조건 사용하는 것이 좋을 것 같았다. 또한 $k$의 범위가 $10^{18}$이지만 적어도 $200$개 이상이 필요한 숫자가 없다는 결론을 내렸다. $dp$로 $cnt$ 함수의 값을 구할 생각을 하고 $dp[i][j]$를 $z_i$이하의 수 중 zebra number가 $j$인 숫자의 개수이다. 그러면 $dp[i][j]=dp[i-1][j]+dp[i-1][j-1]+dp[i-1][j-2]+dp[i-1][j-3]$이 된다. $dp$를 미리 구해놓으면 $cnt(r,x)$를 구할 때 $r$에서 $z_i$를 빼고, $x$에서 1을 빼가면서 $dp[i][x]$를 더하면 답을 구할 수 있다.

'CodeForces' 카테고리의 다른 글

CodeForces Round 1015 - Div 1.5  (0) 2025.05.13
CodeForces Round 940 - Div 2  (0) 2025.05.13
CodeForces Round 942 - Div 1  (0) 2025.04.03
CodeForces Round 945 - Div 2  (0) 2025.03.31
CodeForces Round 1014 - Div 2  (0) 2025.03.31