Processing math: 100%
본문 바로가기
Problem Solving/Codeforces

Codeforces Round #782 div2

by 사향낭 2022. 4. 18.
 

Dashboard - Codeforces Round #782 (Div. 2) - Codeforces

 

codeforces.com

 

 

A. Red Versus Blue

 

 

Problem - A - Codeforces

 

codeforces.com

 

'R'과 'B'의 개수가 주어진다.

 

cntR>cntB 이다.

 

연이어 나오는 문자의 최대 개수가 가장 작은 문자열을 만들어라.

 

( 예를 들어 cntR=2, cntB=1이라고 할 때, "RRB"는 연이어 나오는 문자의 최대 개수는 2, "RBR"은 1이다 )

 

 

cntR>cntB 이므로 'B' 하나하나의 왼쪽 오른쪽에 'R'을 넣는 것이 유리할 것이다.

 

( R...R 'B' R...R 'B' R...R 이러한 방식으로 )

 

사이에 넣을 'R'의 개수를 최대한 분산하면 된다.

 

cntRcntB+1cntRcntB+1.

 

 

 

B. Bit Flipping

 

 

Problem - B - Codeforces

 

codeforces.com

 

n 길이의 '0'과 '1'로만 이루어진 문자열 s가 주어진다.

 

당신은 이 문자열에 정확히 k번 아래와 같은 operation을 진행하여야 한다.

 

- i 1in 를 선택하여 문자열에서 i번째 비트를 제외한 나머지를 flip한다.

( flip이란 0 -> 1, 1 -> 0 으로 비트를 바꾸는 것을 의미한다. )

 

k번의 operation의 통해 구한 사전적으로 가장 큰 문자열과 operation을 위해 선택된 각각 index에 대한 횟수를 구하시오.

 

 

어떤 인덱스를 두 번 선택하는 것은 선택하지 않은 것과 같다는 것은 자명하다.

 

따라서 앞에서부터 순차적으로 operation을 적용하지 않을지, 한 번 적용할지 고려하다 만약 operation의 횟수가 남으면 마지막에 몰아주는 것이 좋다.

 

그리고 사전적으로 가장 큰 문자열을 구하는 것이기에 앞에서부터 1을 만드는 것이 좋을 것이다.

 

앞에서부터 순차적으로 1을 만들어보자.

 

i번째 문자를 고려한다고 할 때, parity를 1부터 i1번째 문자까지 적용한 operation 횟수의 parity라고 하자. ( even이라면 0, odd라면 1 )

 

인덱스 i에 대해 만약 남은 operation의 횟수가 짝수이고 i에 operation을 적용하지 않는다고 한다면 spiarity는 operation을 다 진행했을 때도 그대로이다.

 

따라서 spiarity가 1이라면 i를 선택하지 않으면 되고, 0이라면 한 번 i에 대해 operation을 적용하면 된다. ( 물론 이 경우 parity를 업데이트해주어야 한다. )

 

남은 operation의 횟수가 홀수일 때에도 비슷하다.

 

i에 operation을 쓰지 않는다고 한다면 결과적으로 spiarity가 flip 될 것이다.

 

따라서 spiarity가 0이라면 i를 선택하지 않고, 1이라면 한 번 operation을 적용해주면 된다.

 

이렇게 앞에서부터 1을 만들어가다가 operation을 다 쓰면 이후 문자들은 parity에 따라 update 해주면 된다.

 

operation의 횟수가 남았는데 마지막 인덱스까지 간다면 그만큼 마지막 인덱스에 operation을 해준다.

 

 

 

C. Line Empire

 

 

Problem - C - Codeforces

 

codeforces.com

 

당신은 야심만만한 왕이다.

 

처음에는 제국의 수도가 0에 위치해있다.

 

n개의 정복되지 않은 도시 위치가 주어진다. ( 0<x1<x2<...<xn )

 

당신은 다음과 같은 행동을 할 수 있다.

 

- 제국의 수도 위치가 c1 이고 다른 정복된 도시의 위치가 c2일 때, \( a * |c_1 - c_2| \)의 비용으로 수도의 위치를 c1에서 c2로 바꿀 수 있다.

 

- 제국의 수도 위치가 c1이고 아직 정복되지 않은 도시의 위치가 c2일 때, b|c1c2|의 비용으로 c2에 위치한 도시를 정복할 수 있다.

( 단, c1c2 사이의 모든 도시들은 정복된 상태여야 한다. )

 

주어진 n개의 도시를 정복하기 위한 최소 비용을 구하시오.

 

 

조금은 전형적인 greedy 문제이다.

 

현재의 수도 위치에서 다음 정복할 도시를 생각할 때, 현재의 수도에서 정복되지 않은 모든 도시들을 정복하기 위한 비용 vs 가능한 한 가장 오른쪽으로 수도를 옮긴 이후 정복되지 않은 모든 도시들을 정복하기 위한 비용을 비교하여 수도의 위치를 옮기는 것이 더 낫다면 옮기면 된다.

 

 

 

D. Reverse Sort Sum

 

 

Problem - D - Codeforces

 

codeforces.com

 

n개의 원소를 가진 배열 A를 생각해보자.

( 모든 원소들은 0 또는 1이다. )

 

함수 f(k,A)를 다음과 같이 정의하자.

 

- A의 앞에서 k개의 원소들만 non-decreasing 순서로 정렬한 배열 Bk를 반환한다.

( 나머지는 그대로, ex) f(2,[1,0,0,1,0]=[0,1,0,1,0]

 

k를 1에서 n까지 넣어서 구한 함숫값 B1,B2,...,Bn을 생각해보자.

 

그리고 배열 CB1,B2,...,Bn들을 element-wise sum을 하여 구한 배열이다.

 

배열 C가 주어졌을 때, 배열 A를 구하시오.

 

 

먼저, C 원소들을 모두 더하여 n으로 나누어 A에 있는 1의 개수(cnt라 하자)를 구할 수 있다.

 

마지막 원소 (Cn) 부터 살펴보자.

 

만약 Cn이 n이라면 An의 값은 1이고, 그렇지 않다면 An의 값은 0이다.

 

이렇게 An 값을 구한 후 C에서 Bn을 빼준다.

 

여기서 Bn은 뒤에서 cnt만큼의 원소들이 1, 나머지 원소들은 0인 형태를 띨 것이다.

 

이를 segment tree나 BIT, 또는 끝나는 위치를 배열에 저장하여 구현할 수 있다.

 

An이 1이라면 cnt에서 1을 빼주자.

 

그다음, Cn1에 대해서는 처음부터 원소의 개수가 n1이었던 것처럼 앞의 과정을 진행하면 된다.

 

앞으로 움직이며 모든 Ai의 값을 구해주자.

 

 

 

E. AND-MEX Walk

 

 

Problem - E - Codeforces

 

codeforces.com

 

 

'Problem Solving > Codeforces' 카테고리의 다른 글

Codeforces Round #788 div2  (0) 2022.05.07
Codeforces Round #787 div3  (0) 2022.05.06
Educational Codeforces Round #126  (0) 2022.04.12
Codeforces Round #781 div2  (0) 2022.04.10
Codeforces Round #780 div3  (0) 2022.04.01

댓글