Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
관리 메뉴

lmlmlm

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

문제풀기

Educational Codeforces Round 161 (Rated for Div. 2)

lml 2024. 1. 19. 16:04

코포를 꽤나 오랜만에 한 것 같은 느낌.

좀 쉽게 나온 편이긴 한데 아무튼 선방했다. (All solved at 01:05)

 

 

A. Tricky Template

 

간단하게 문제 조건을 만족하는 template을 만들어보면 된다.

세 개의 string a, b, c에 대해서 a[i] != c[i] && b[i] != c[i]인 i가 존재한다면 이러한 template을 만들 수 있다.

 

B. Forming Triangles

 

2^x의 특징은 x < y < z라면 무조건 2^x + 2^y < 2^z라는 점이다.

따라서 최소한 두 개의 변은 동일하여야 한다.

1) x가 두 변인 이등변 삼각형의 개수 = C(cnt[x], 2) * (x보다 짧은 선분의 개수)

2) x가 세 변인 정삼각형의 개수 = C(cnt[x], 3)

 

C. Closest Cities

 

우선 closest city 자체를 구하는 것은 그냥 양 옆의 도시를 비교하면 되므로 간단하다.

편의를 위해서 쿼리의 x, y가 반드시 x < y 라고 가정하자. (x > y라면 정확히 반대로 하면 된다.)

우리는 평소에 x와 y의 거리를 구한다면 a[y] - a[x] 등의 방법으로 구한다.

하지만 문제에서는 closest로 비용 1로 이동할 수 있으므로, a[y] - a[x]가 아니고, 어떤 다른 b[y] - b[x]인 b를 이용해야 한다.

 

b를 구하는 것은 쉽다. b[0] = 0이라고 했을 때

1) i - 1번째 도시에서 제일 가까운 도시가 i라면 : b[i] = b[i - 1] + 1

2) 만일 아니라면 : b[i] = b[i - 1] + (a[i] - a[i - 1])

로 정의해주면, b[y] - b[x]를 통해서 답을 구할 수 있다.

 

D. Berserk Monsters

 

다양한 구현 방법이 있을 것이다.

핵심은 만일 {A, B, C}의 세 몬스터가 동시에 살아남는다면, 다음 번에도 B는 절대로 죽을 일이 없다.

따라서 처음에는 모든 N개의 몬스터가 죽는지 확인해주어야 하지만,

나머지 N - 1개의 라운드에서는 이전 라운드에 죽은 몬스터 양 옆에 있던 몬스터가 죽는지만 확인해주면 된다.

어차피 몬스터는 한 번밖에 못 죽고, 양 옆에는 최대 2개이니, 3N번 이상 확인할 일은 없다.

 

E. Increasing Subsequences

 

{x, y, z}의 sequence가 총 N개의 incresing subsequence를 가졌다고 가정하자.

1) 만일 엄청 작은 숫자가 맨 앞에 붙는다면 : {-1e9, x, y, z}는 2N개의 increasing subsequence를 가진다.

2) 만일 엄청 큰 숫자가 맨 앞에 붙는다면 : {1e9, x, y, z}는 N + 1개의 increasing subsequence를 가진다.

따라서 문제에서 주어지는 X에 대해서 비트에 맞게 숫자들을 잘 추가해주면 된다.

자세한 것은 >>코드참고<<

 

주의) 애초에 원소가 하나라도 있다면 increasing subsequence는 2개이다.

-> 즉 0부터 시작하는게 아니기에 막무가내로 2배 때리면 안되고, 제일 큰 비트부터 잘 다루어야 한다.

 

F. Replace on Segment

 

DP를 하면 된다.

-> YES[L][R][X] : [L, R] 범위에 있는 모든 숫자를 모두 X로 통일 시키기 위해 필요한 비용

-> NO[L][R][X] : [L, R] 범위에 있는 모든 숫자를 X가 아니게 하기 위해 필요한 비용

 

[L, R]에 X가 없도록 하는 방법은

1) [L, MID], [MID + 1, R] 각자에 X가 없도록 하기.

2) [L, R] 범위 내에 적당히 작업을 친 다음에 문제에서 주어진 Operation로 [L, R]에 X가 아니라 다른 숫자로 바꾸기

등의 방법이 있다.

 

한 번 WA를 맞았기 때문에 본인은 안전빵으로 덕지덕지 여러 작업들을 붙여두었다 (코드)

정확히 얼만큼 고려해주어야 하는지는 미래에 올라올 editorial 참고

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

Atcoder Regular Contest 171  (1) 2024.02.04
월간 향유회 2024. 01.  (2) 2024.01.28
Good Bye 2023 Codeforces  (1) 2024.01.06
2023 Benelux Algorithm Programming Contest (BAPC 23)  (0) 2023.12.01
2023 ICPC 인터넷 예선 후기  (0) 2023.10.24
Comments