Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
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
Tags
more
Archives
Today
Total
관리 메뉴

lmlmlm

Educational Codeforces Round 148 (Rated for Div. 2) 본문

문제풀기

Educational Codeforces Round 148 (Rated for Div. 2)

lml 2023. 5. 23. 00:49

https://codeforces.com/contest/1832

 

A. New Palindrome

 

s[0] ~ s[n / 2]가 모두 동일한 경우에만 YES이다.

만일 아니라면, 저 안에서 순서를 바꾸면 새로운 palindrome이 된다.

 

B. Maximum sum

 

이게 그리디가 될 거라 생각했는데, 안돼서 뇌정지가 왔었다.

아무튼 정렬을 해둔다면 prefix sum으로 모든 경우의 수를 다해볼 수 있다.

즉, 첫 operation을 i번, 두 번째를 k - i번 한다고 가정한다면, psum[n - (k - i)] - psum[i * 2] 정도를 모두 계산해보면 된다.

 

C. Contrast Value

 

만일 |a[i] - a[i + 1]| + ... + |a[j - 1] - a[j]| = |a[i] - a[j]|이려면, a[i]부터 a[j]까지 단조증가거나 단조감소여야 한다.

따라서 기울기가 바뀌는 순간만 잘 따져주면 된다.

이거도 모두 같은 경우에는 답이 1이 되므로 조심해야 한다.

 

D. Red-Blue Operations

 

우선, 당연하게도 맨 마지막에 전부 red를 blue로 바꿔가면서 숫자들을 키우는게 이득임을 알 수 있다.

그 전에는 반드시 -(뭐시기)가 생겨나게 되는데, i번째와 (i + 1)번째를 같은 곳에 하여 -1을 주는게 이득이다.

따라서 단순하게 k, k - 1, ... k - n + 1까지는 전부 숫자를 더하고, 남은 (k - n) / 2는 잘 -1을 분배해주면 된다.

다만, k와 n의 기우성이 서로 다를 경우에는 k - n + 1을 사용하지 못함에 주의하고, -1이 (k - n) / 2 + 1개가 된다.

 

당연히 숫자를 더하는 것은 a를 정렬 했을 때 제일 작은 수부터 제일 큰 수를 더해주는 것이 이득이다.

-> 숫자를 빼주는 것은 이제 제일 큰 애부터 빼주면 된다.

-> 하지만 이렇게 빼는 것은 너무 느리다.

-> 더했을 때 최소 원소를 mini라고 하였을 때 (모든 원소의 합) - (mini * n)번의 -1은 전혀 영향을 끼치지 않는다

-> 따라서 (k - n + 1) / 2 - {(모든 원소의 합) - (mini * n)} = m이라고 하자. (남은 -1의 횟수를 의미)

-> 그러면 모든 원소들이 지금 mini로 맞춰졌으므로, 순서대로 돌아가면서 -1을 빼주면 된다.

-> 따라서 mini - (m - 1) / n - 1이 답이 된다.

 

가만히 보고 있으면 대충 항상 a[i]에는 k - i와 비슷한 숫자가 더해짐을 알 수 있다.

그래서 적당히 a[i] - i를 이용하여 미리 계산을 해두면, 모든 k에 대해 적용시킬 수 있음을 알 수 있다.

따라서 k < n인 경우, k와 n의 기우성이 다른 경우, k와 n의 기우성이 같은 경우 각각에 대해 필요한 계산을 해두면 된다.

 

어떻게 operation을 하는지 정확히 이해했다면, editorial의 풀이가 더 짧은 것 같으니 그것을 참고하자.

 

E. Combinatorics problem

 

대충 숫자들을 써보면 파스칼의 삼각형에서 보던 숫자들임을 알 수 있다.

즉, b1, b2 같은 것들이 누적합이라는 것이다.

그냥 a값 : a1, a2, a3, a4, ....

k = 0 : a1, a1 + a2, a1 + a2 + a3, ...

k = 1 : a1, (2a1 + a2), ...

-> 따라서 단순히 누적합을 k + 1번 계산해주면 답을 얻을 수 있다.

 

F. Zombies

 

솔직히 전혀 감도 안 잡혀서 virtual이 끝나는 즉시 풀이를 열어봤다.

풀이가 웬일로 친절하게 적혀있었다.

 

핵심관찰 1) 각 generator의 작동시간이 [Li, Ri)로 정해져 있다고 가정하자

-> 만일 새로운 entrance [lj, rj)가 있다면, abs(Li + Ri - lj - rj)값이 최소인 generator i를 고르는 것이 이득이다.

-> 따라서 각 entrance들은 lj + rj에 대해 정렬된 순서대로 generator들에 대응되고, 묶인다

 

-> 그러면 적당히 흔한 그룹으로 묶는 dp들처럼 O(N^3) 정도로 dp[i][j] = (i번까지 j개 그룹의 최댓값)을 계산가능하다

핵심관찰 2) 그럼 적당히 흔한 dp최적화인 DnC optimization이 가능하다

-> 엄밀히까지 가지 않더라도, 대충 단조성이 보이기 때문이다.

 

핵심관찰 3) 이제 그러면 cost(i, j)를 계산하는 일만 남았다.

-> 이때 opt(i, j - 1)과 opt(i + 1, j) 사이에 opt(i, j)가 있다는 점을 이용하여 knuth와 유사하게 optimizaiton이 된다.

 

물론 핵심관찰 1을 보지 못한게 크다지만, DP optimization을 꽤 많이 봐왔는데 감도 못 잡았다는게 슬프다

 

 

'문제풀기' 카테고리의 다른 글

2022 ICPC Asia Taiwan Online Programming Contest  (0) 2023.05.24
AtCoder Beginner Contest 301  (0) 2023.05.24
AtCoder Beginner Contest 302  (0) 2023.05.22
Codeforces Round 870 (Div. 2)  (0) 2023.05.06
AtCoder Beginner Contest 300  (0) 2023.04.29
Comments