_
1. Div2 A
Yet Another String Game
- 사전순으로 가장 작게 만들거나 가장 크게 만들 때 가장 중요한 위치를 생각해보면 가장 앞에 있는 문자가 가장 중요한 것을 알 수 있다.
- 따라서 두 사람은 자신의 차례에 남아있는 index 중 최소
i
를 잡아 \(s_i\)를 바꿀 것이다.
- 따라서 앞에서부터 두 사람이 번갈아 가면서 문자를 바꿔가며, 각 사람이 문자\(s_i\)를 바꾸는 규칙은 다음과 같다.
- Alice (최대한 사전순 최소 문자로 바꿈)
- \(s_i = a \Longrightarrow s_i = b\)
- \(s_i \neq a \Longrightarrow s_i = a\)
- Bob (최대한 사전순 최대 문자로 바꿈)
- \(s_i = z \Longrightarrow s_i = y\)
- \(s_i \neq z \Longrightarrow s_i = z\)
2. Div2 B
The Great Hero
- 모든 monster를 죽이고 great hero도 죽을 수 있기 때문에, 마지막 great hero의 health value가 0 이상인지를 통해 판별이 불가능하다.
- 하지만, 마지막 공격 이전까지 great hero의 health value가 0보다 큰 경우 모든 monster를 죽일 수 있음을 알 수 있다.
- 즉, 마지막 공격을
i
번 monster에게 한 경우 $$(i번\ 이외\ monster들의\ 공격) + (i번\ monster\ 공격\ 횟수-1) \times a_i < B$$인 경우 모든 monster를 죽일 수 있다.
- 이때 식을 변형하면 $$(모든\ monster들의\ 공격) - a_i < B$$가 되기 때문에 \(a_i\)가 최대가 되도록 \(i\)를 결정하여
i
번째 monster를 가장 마지막으로 공격할 때 조건을 만족하는지 판별하면 된다.
3. Div2 C / Div1 A
Searching Local Minimum
- Binary Search와 비슷한 방식을 사용하면 된다.
- 다음 조건들을 만족하는
(s, e)
구간을 계속 관리하자.
- \(a_{s-1} > a_{s}\)
- \(a_{e} < a_{e+1}\)
- 처음
(s, e)
구간을 (1, N)
으로 초기화하면 조건을 만족하는 것을 알 수 있다.
(s, e)
구간의 크기를 계속 줄일 건데, 다음과 같은 연산을 할 수 있다.
- \(s\leq m < m+1 \leq e\)인 \(m\)을 잡자.
- \(a_{m} < a_{m+1}\)인 경우 : 구간을
(s, m)
으로 갱신
- \(a_{m} > a_{m+1}\)인 경우 : 구간을
(m+1, e)
로 갱신
- \(m = (s+e)/2\)로 \(m\)값을 설정하면 구간 크기는 항상 절반으로 줄어든다.
- 마지막에 구간이
(x, x+1)
꼴로 남으면 답은 \(a_x, a_{x+1}\) 중 작은 값의 index가 된다.
- 구간이
(x, x)
꼴로 남으면 답은 x
가 된다.
4. Div2 D1 / Div1 B1
Painting the Array I
4.1. DP Solution
i
번째 원소를 보고 있을 때 DP[j][k] = (x, y)
와 같이 Pair를 사용하여 두 값을 저장한다.
j
: 0인 경우 \(a_i\)는 \(a^{(0)}\)에 위치 / 1인 경우 \(a_i\)는 \(a^{(1)}\)에 위치
k
: 0에 \(seg(a^{(0)}) + seg(a^{(1)})\)의 최댓값 저장, 1에 \(seg(a^{(0)}) + seg(a^{(1)})\)의 2번째 최댓값 저장
x
: 저장된 \(seg(a^{(0)}) + seg(a^{(1)})\) 값
y
: 해당 \(seg(a^{(0)}) + seg(a^{(1)})\)를 갖는 경우에서 \(a^{(1-j)}\)에 위치한 마지막 원소의 위치
i
번쨰 원소 \(a_i\)를 \(a^{(0)}\) 또는 \(a^{(1)}\)에 추가할 때 마지막 값이 \(a_i\)인 경우와 \(a_i\)가 아닌 경우 2가지 경우에 \(seg(a^{(0)}) + seg(a^{(1)})\)값에 다른 변화가 생긴다.
- 따라서 DP 테이블에
k
를 이용하여 최댓값을 갖는 2가지 케이스를 저장해주면서 테이블을 채우면 답을 구할 수 있다.
4.2. Greedy Solution
- \(a^{(0)}\)와 \(a^{(1)}\)의 마지막 원소를 각각 \(x_0, x_1\)이라 하자.
- 원소
k
를 추가할 때 다음과 같이 경우를 나눈다.
- \(k=x_0\) 또는 \(k=x_1\)
- \(k\)와 같은 원소가 있는 배열과 반대인 배열에 \(k\)를 추가한다.
- \(k \neq x_0 \) 이고 \(k \neq x_1\)
k
다음으로 가장 빨리 나오는 \(x_0\)과 \(x_1\)의 위치를 \(pos_{x_0}, pos_{x_1}\)라 하면 다음 위치에 k
를 추가
- \(pos_{x_0} < pos_{x_1} \Longrightarrow a^{(0)}\)
- \(pos_{x_0} > pos_{x_1} \Longrightarrow a^{(1)}\)
5. Div2 D2 / Div1 B2
Painting the Array II
5.1. Greedy Solution
6. Div2 E / Div1 C
Continuous City
7. Div1 D
Odd Mineral Resource
8. Div1 E
School Clubs
최근 수정 시각: 2021-08-08 15:22:21
기여자: