SlideShare a Scribd company logo
1 of 26
2019 PPC 해설
POSTECH Programming Contest
POSTECH Programming Contest
작년 PPC
POSTECH Programming Contest
- 어떻게 하면 신입생들이 더 쉽게 풀 수 있을까?
- 어떻게 하면 ICPC Rule에 더 맞게 출제할 수 있을까?
1. 모든 문제를 푼 팀이 없을 것
2. 모든 문제는 한 팀 이상에게 풀릴 것
3. 모든 팀이 한 문제 이상 풀 것
올해의 목표
POSTECH Programming Contest
- 강병지: A – Scoring Hack, D – Conquering A Castle, G – Team Selection
- 임병찬: B – Good Pizza, Great Pizza, E – Delicious Pineapple Pizza, H – Pineapple Advertising,
J – Almost-K Increasing Subsequence
- 정현식: C – Heights, F – Linear-Feedback Shift Register, I – Kaka & Bebe
문제 출제
POSTECH Programming Contest
- Dynamic Programming을 사용해서 해결할 수 있다.
- DP[x][k][i]를 x점을 k턴 안에, i번의 x2 연산을 사용해서 만들 수 있을 때 true, 그렇지 않을 때 false라고 하자.
- 이 경우 D[x][k][i]는
(x >= a and D[x-a][k-1][i] ) (x-a점에서 a점을 더해 x점을 만드는 경우) or
(x >= b and D[x-b][k-1][i] ) (x-b점에서 b점을 더해 x점을 만드는 경우) or
(x %2 == 0 and i <= k/10 and D[x/2][k-1][i-1] ) (x/2 점에서 점수를 두 배로 해 x점을 만드는 경우)
로 나타난다.
- 따라서 각 D[x][k][i]는 O(1)에 계산 가능하다.
- 각 D[x][k][i] 를 계산한 뒤에 n <= x < n+a를 만족하는 x 중에서 D[x][k][i]를 만족하는 k의 최솟값을 구하면
답이 된다.
A - Scoring Hack
Scoring Hack
POSTECH Programming Contest
- 게임이론 문제이다.
- 𝑖=1
𝑛
2−𝑑 𝑖 ≥ 1 인 경우 𝑑𝑖 들의 multiset X를 다음과 같은 두 개의 multiset A, B로 나눌 수 있다.
- 𝑑 𝑖∈𝐴 2−𝑑 𝑖 ≥
1
2
, 𝑑 𝑖∈𝐵 2−𝑑 𝑖 ≥
1
2
, 𝐴 ∩ 𝐵 = ∅, 𝐴 ∪ 𝐵 = 𝑋
- 증명은 multiset X의 크기 n에 대해 수학적 귀납법을 사용하면 보일 수 있다.
D - Conquering A Castle
Conquering A Castle
POSTECH Programming Contest
Conquering A Castle
- 반 대 로 𝑖=1
𝑛
2−𝑑 𝑖 < 1 인 경 우 , X 를 A 와 B 두 개 의 multiset 으 로 어 떻 게 나 누 더 라 도 , 𝑑 𝑖∈𝐴 2−𝑑 𝑖 <
1
2
,
𝑑 𝑖∈𝐵 2−𝑑 𝑖 <
1
2
둘 중 하나는 만족한다.
- A의 필승 전략은 𝑖=1
𝑛
2−𝑑 𝑖 ≥ 1 인 경우 존재한다.
- 군사들을 𝑑 𝑖∈𝐴 2−𝑑 𝑖 ≥
1
2
, 𝑑 𝑖∈𝐵 2−𝑑 𝑖 ≥
1
2
, 𝐴 ∩ 𝐵 = ∅, 𝐴 ∪ 𝐵 = 𝑋 를 만족하도록 A와 B, 둘로 나누어서 서로 다른
길에 배치하면 된다. 이 경우 한 턴이 지나고 나면, 다시 𝑖=1
𝑛
2−𝑑 𝑖 ≥ 1 가 만족되므로, 같은 전략을 반복하면
결국 승리하게 된다.
- 반대로 B의 필승전략은 𝑖=1
𝑛
2−𝑑 𝑖 < 1인 경우 존재하며 𝑑 𝑖∈𝐴 2−𝑑 𝑖 <
1
2
, 인 경우 B에 있는 군사를 모두 없애고, 그
렇지 않은 경우 A에 있는 군사를 모두 없애 각 턴에서 𝑖=1
𝑛
2−𝑑 𝑖 < 1 조건을 유지시키는 것이다.
POSTECH Programming Contest
- 어떤 역할군 순서로 팀을 선택할지, 5!개의 경우가 존재한다.
- 역할군의 순서가 주어져 있을 때, dynamic programming을 통해,
- DP[i][j]를 1~i번째 후보자들에게, 1~j번째의 역할군을 배정할 때 얻을 수 있는 실력의 합의 최댓값이라고 하자.
- DP[i][j] = max(DP[i-1][j] (i번째 후보자에게 j번째 역할군을 배정하지 않는 경우),
DP[i-1][j-1] + i번째 후보자의 j번째 역할군 실력 (i번째 후보자에게 j번째 역할군을 배정하는 경우))
로 나타난다.
- 따라서 DP[n][5]가 위의 순서로 팀을 선택할 때 얻을 수 있는 실력의 합의 최댓값이고, O(5n)에 구할 수 있다.
- 가능한 모든 순서에 대해 계산해서 최댓값을 구하면 O(5!*5*n) 에 실력의 합의 최댓값을 구할 수 있다.
G - Team Selection
Kaka & Bebe
POSTECH Programming Contest
- 마름모는 기울어진 정사각형이기 때문에, 대각선의 길이를 𝐶라고 하면, 넓이는
𝐶2
2
다.
- 대각선의 길이는 어떻게 구할까?
- 모든 점이 𝑦 = 𝑥 + 𝑎1와 𝑦 = 𝑥 + 𝑎2사이에 존재한다면, 𝐶는 𝑎1 − 𝑎2 보다 커야 한다.
- 마찬가지로, 모든 점이 𝑦 = 𝑥 + 𝑏1와 𝑦 = 𝑥 + 𝑏2사이에 존재한다면, 𝐶는 𝑏1 − 𝑏2 보다 커야 한다.
- 𝐶가 작을수록 넓이가 작아지므로, 𝐶 = max( 𝑎1 − 𝑎2 , 𝑏1 − 𝑏2 ).
- 𝑎1, 𝑎2, 𝑏1, 𝑏2는 모두 𝑂(𝑛) 시간 안에 계산해 낼 수 있다.
B – Good Pizza, Great Pizza
Good Pizza, Great Pizza
POSTECH Programming Contest
Good Pizza, Great Pizza
- 𝐶의 범위는 0이상 40억 이하다.
- 𝐶2
은 long long int 범위를 초과할 수 있다!
- 𝐶 = 2𝑘라면, 넓이는 2𝑘2
이다.
- 𝐶 = 2𝑘 + 1이라면, 넓이는 2𝑘2
+ 2𝑘 + 0.5다.
POSTECH Programming Contest
- 우리는 파인애플과 도우를 한개씩 쌍을 만들어 줘야 한다. 즉, 파인애플과 도우의 매칭이라고 생각할 수 있다.
- 적절한 값 h가 있다고 하자. 파인애플과 도우를 Bipartite Matching을 하는데, 파인애플과 도우를 연결할 조건이
“파인애플의 품질 XOR 도우의 품질 ≥ h” 라고 하자.
- 만약 매칭이 되면? 최소값이 h 이상이 되게 하는 파인애플과 도우의 쌍이 존재한다. 즉, 답은 h 이상이다.
- 만약 매칭이 안되면? 어떻게 해도 최소값이 h 이상이 되게 만들 수 없다. 즉, 답은 h 미만이다.
- 즉, h를 기준으로 Binary Search가 가능하다.
E – Delicious Pineapple Pizza
Delicious Pineapple Pizza
POSTECH Programming Contest
Delicious Pineapple Pizza
- h는 0이상 231
이하므로 Iteration 수는 log 231
= 31번이다.
- 각 Iteration마다, Flow Graph를 만들고 Maximum Matching을 구한다.(Bipartite Graph의 Maximum Matching은
Maximum Flow로 구할 수 있다.)
- 𝑉 = 𝑂 𝑛 , 𝐸 = 𝑂 𝑛2
, 𝐹 = 𝑂(𝑛)이고 Ford-Fulkerson은 𝑂(𝐹𝐸)의 시간에 동작하므로, 한 Iteration당 𝑂(𝑛3
)의 시간
이 소요된다.
- 전체 Time Complexity = 𝑂(31𝑛3
). 무난하게 AC된다.
- 추가) Ford-Fulkerson말고 Dinic Algorithm을 사용할 수 있다. Dinic은 𝑂 𝑉2
𝐸 = 𝑂(𝑛4
)이 소요된다. 하지만, 모
든 capacity가 0 혹은 1이면 Dinic은 𝑂(min 𝑉
2
3, 𝐸
1
2 𝐸)가 걸린다는게 알려져 있다.
- 즉, Dinic을 사용할시 Time Complexity = 𝑂(31𝑛
8
3).
POSTECH Programming Contest
- 핵심 아이디어: 한번 집 a를 들렸다면, 다음에 다시 집 a를 들릴 때, 다시 탐색할 필요가 없다. 왜냐하면, 새로
피자를 좋아하게 된 집은 무조건 0개기 때문이다.
- 쿼리를 받으며, 한번도 안들린 집이면 탐색하고, 한번이라도 들린 집이면 0을 출력하고 탐색하지 않는다.
- 한번 탐색할때는, 그냥 주위에 있는 집 하나하나 탐색한다.
- Time Complexity = 𝑂(𝑁 + 𝑑𝑖 + 𝑄). 𝑑𝑖 = 2𝑀 이므로, 이 알고리즘은 𝑂(𝑁 + 𝑀 + 𝑄)에 동작한다.
H – Pineapple Advertising
Pineapple Advertising
POSTECH Programming Contest
- 문제를 간단히 하기 위해, K는 1이고 𝑏𝑖 > 𝑏𝑖+1라고 가정하자.
- 그러면, 𝑏1 ≤ 𝑏2 ≤ ⋯ ≤ 𝑏𝑖, 𝑏𝑖+1 ≤ 𝑏𝑖+2 ≤ ⋯ ≤ 𝑏 𝑚이다.
- B가 A의 subsequence므로, 적당한 h가 존재해서, 𝑏1~𝑏𝑖는 𝑎1~𝑎ℎ의 subsequence,
- 𝑏𝑖+1~𝑏 𝑚은 𝑎ℎ+1~𝑎 𝑛의 subsequence다.
- 따라서, 모든 h에 대해, 𝑎1~𝑎ℎ의 LIS의 길이 + 𝑎ℎ+1~𝑎 𝑛의 LIS의 길이의 최대값을 구하면 된다.
J - Almost-K Increasing Subsequence
Almost-K Increasing Subsequence
POSTECH Programming Contest
Almost-K Increasing Subsequence
- K>1이라면? K+1개의 partition을 만든다!
- 수열 A를 서로 겹치지 않는 K+1개의 segment로 나눈다고 하자.
- 즉, 𝑎1~𝑎 𝑛 = 𝑎1~𝑎ℎ1
/𝑎ℎ1+1~𝑎ℎ2
/.../𝑎ℎ 𝐾+1~𝑎 𝑛
- Longest Almost-K Increasing Subsequence의 길이는 K+1개의 segment의 LIS 합의 최대값과 같다.
- K+1개의 segment의 LIS 합의 최대값은 어떻게 찾을까?
POSTECH Programming Contest
Almost-K Increasing Subsequence
- LIS[s][t] = 𝑎 𝑠~𝑎 𝑡의 LIS의 길이라 정의하자.
- DP[s][t] = 𝑎 𝑠~𝑎 𝑛을 t개의 partition을 내었을때 길이의 합의 최대값이라 정의하자.
- DP[s][t] = max(DP[h+1][t-1]+LIS[s][h])
- 구해야 하는값: DP[1][K+1]
- DP Time Complexity = 𝑂(𝐾𝑛2
), LIS 배열을 만드는 Time Complexity = 𝑂(𝑛2
log 𝑛)
- 총 Time Complexity = 𝑂(𝐾𝑛2
+ 𝑛2
log 𝑛)
POSTECH Programming Contest
- 다양한 풀이가 존재합니다.
- 헤론의 공식을 사용하는 풀이와 헤론의 공식을 사용하지 않는 풀이로 나뉩니다.
헤론의 공식이란?
각 변의 길이를 𝑎, 𝑏, 𝑐 라 하자. 𝑠 =
𝑎+𝑏+𝑐
2
로 정의 할 때 넓이 𝑆는 𝑆 = 𝑠 𝑠 − 𝑎 𝑠 − 𝑏 𝑠 − 𝑐 이다.
C - Heights
Heights
POSTECH Programming Contest
Heights
풀이 1)
넓이 𝑆에 대해 2𝑆 = 𝑎ℎ 𝑎 = 𝑏ℎ 𝑏 = 𝑐ℎ 𝑐. 즉 𝑎 =
2𝑆
ℎ 𝑎
, 𝑏 =
2𝑆
ℎ 𝑏
, 𝑐 =
2𝑆
ℎ 𝑐
𝑆2
= 𝑠 𝑠 − 𝑎 𝑠 − 𝑏 𝑠 − 𝑐 =
𝑎 + 𝑏 + 𝑐 −𝑎 + 𝑏 + 𝑐 𝑎 − 𝑏 + 𝑐 𝑎 + 𝑏 − 𝑐
16
=
1
16
2𝑆
ℎ 𝑎
+
2𝑆
ℎ 𝑏
+
2𝑆
ℎ 𝑐
−
2𝑆
ℎ 𝑎
+
2𝑆
ℎ 𝑏
+
2𝑆
ℎ 𝑐
2𝑆
ℎ 𝑎
−
2𝑆
ℎ 𝑏
+
2𝑆
ℎ 𝑐
2𝑆
ℎ 𝑎
+
2𝑆
ℎ 𝑏
−
2𝑆
ℎ 𝑐
=
1
ℎ 𝑎
+
1
ℎ 𝑏
+
1
ℎ 𝑐
−
1
ℎ 𝑎
+
1
ℎ 𝑏
+
1
ℎ 𝑐
1
ℎ 𝑎
−
1
ℎ 𝑏
+
1
ℎ 𝑐
1
ℎ 𝑎
+
1
ℎ 𝑏
−
1
ℎ 𝑐
𝑆4
이를 통해 𝑆를 구할 수 있다.
POSTECH Programming Contest
Heights
풀이 2)
- 넓이 𝑆에 대해 2𝑆 = 𝑎ℎ 𝑎 = 𝑏ℎ 𝑏 = 𝑐ℎ 𝑐. 즉 𝑎 =
2𝑆
ℎ 𝑎
, 𝑏 =
2𝑆
ℎ 𝑏
, 𝑐 =
2𝑆
ℎ 𝑐
- 임의로 잡은 어떤 값 𝑥에 대해서, 𝑎′
=
2𝑥
ℎ 𝑎
, 𝑏′
=
2𝑥
ℎ 𝑏
, 𝑐′
=
2𝑥
ℎ 𝑐
라고 하자.
- 이를 헤론의 공식에 대입해 얻은 넓이를 𝑦라 하자. 우리가 원하는 값 𝑆는 𝑥 = 𝑦일 때 𝑥이다.
- 만약 𝑥 > 𝑦라면, 𝑦는 𝑥2
에 비례하기 때문에 𝑆 > 𝑥이다. 만약 𝑥 < 𝑦라면, 𝑆 < 𝑥이다.
- 𝑆의 최소값과 최대값은 문제의 조건에 따라서 대략적으로 구할 수 있다. 이를 통해 𝑥에 대한 이분 탐색을 시행해
𝑆를 구한다.
POSTECH Programming Contest
Heights
풀이 3) (헤론의 공식 X)
- 가장 긴 변을 𝑐라고 하자.
- 오른쪽 그림과 같이 수선을 그어 𝑘를 정의할 수 있다.
- 𝑐를 추측한 값 𝑥에 대해, 𝑎′
=
ℎ 𝑐
ℎ 𝑎
𝑥, 𝑏′
=
ℎ 𝑐
ℎ 𝑏
𝑥.𝑐′
= 𝑎′2
− ℎ 𝑐
2
+ 𝑏′2
− ℎ 𝑐
2
.
- 𝑐값은 𝑐′
= 𝑥일 때 𝑥이다. 𝑐′
− 𝑥 는 𝑥에 대해 단조증가 하기 때문에, 풀이 2와 마찬가지로 𝑥에 대해 이분 탐색이
가능하다. (단조증가에 대한 엄밀한 증명은 생략, 스스로 생각해보세요!)
이외에도 정말 다양한 풀이들이 있음!
𝑎 𝑏
𝑐
𝑘 𝑐 − 𝑘
ℎ 𝑐
POSTECH Programming Contest
풀이 1)
- 모든 경우의 수를 확인하여, 사전 순으로 가장 빠른 것을 고른다.
- 단순하게 풀면 236
이므로 시간 내에 불가능.
F - Linear-Feedback Shift Register
Linear-Feedback Shift Register
POSTECH Programming Contest
Linear-Feedback Shift Register
풀이 2)
- Meet in the middle을 사용해 풀 수 있다.
- 𝑟36 이후의 𝑟𝑖는 결국 𝑟0~𝑟35 중 일부를 XOR한 것이며,
이는 𝑟0~𝑟17에 대한 XOR 식과 𝑟18~𝑟35에 대한 XOR 식으로 나타낼 수 있다.
- 이를 수식으로 표현하면, 𝑟𝑖 = 𝑓𝑖(𝑟0, 𝑟1, … , 𝑟17)⨂𝑓𝑖
′
𝑟18, 𝑟19, … , 𝑟35 라고 쓸 수 있다.
- 이 때, XOR은 𝑎⨂𝑎 = 0이고 𝑎 = 𝑏 ⇔ 𝑎⨂𝑐 = 𝑏⨂𝑐가 성립함에 유의한다.
POSTECH Programming Contest
Linear-Feedback Shift Register
- 𝑟18~𝑟35에 대해 사전 순으로 순회를 돌면서, 𝑟𝑖⨂𝑓𝑖
′
𝑟18, 𝑟19, … , 𝑟35 값들을 구하고, 이를 map에 저장한다.
(map[ 𝑟𝑖⨂𝑓𝑖
′
𝑟18, 𝑟19, … , 𝑟35 ] = 𝑟18 𝑟19 … 𝑟35 , 이미 entry가 있다면 해당 entry가 사전 순으로 더 빠르므로 넘어간다.)
- 𝑟0~𝑟17에 대해 사전 순으로 순회를 돌면서, 𝑓𝑖(𝑟0, 𝑟1, … , 𝑟17)를 구한 뒤 map에 entry가 있는지 확인한다.
- entry가 있다면 𝑟0~𝑟17와 map[𝑓𝑖(𝑟0, 𝑟1, … , 𝑟17)]을 이어 붙인 것이 답이다.
- 답이 존재한다면 𝑟𝑖 = 𝑓𝑖(𝑟0, 𝑟1, … , 𝑟17)⨂𝑓𝑖
′
𝑟18, 𝑟19, … , 𝑟35 이므로 𝑟𝑖 ⨂ 𝑓𝑖
′
𝑟18, 𝑟19, … , 𝑟35 = 𝑓𝑖(𝑟0, 𝑟1, … , 𝑟17)여야 함에 유의
한다.
- 시간 소요는 218
log 218
이다. (map insert/access가 O log 𝑁 이므로)
POSTECH Programming Contest
- 새로운 그래프를 정의하자. 정점 (v, d)는 원래 그래프의 정점 v까지 도달하는데 경로 상의 Bebe 수가 d마리임을
의미한다.
- 원래 그래프는 정점 a와 정점 b를 잇는 (c, d) 가중치를 가지는 간선들로 구성된다.
- 이를 새로운 그래프에서는 0≤p≤1000-d인 정수 p에 대해 정점 (a, p)와 정점 (b, p+d)를 잇는 가중치 c의 간선으
로 바꾼다.
- 물론 (b, p)와 (a, p+d)도 가중치 c로 이어준다.
I - Kaka & Bebe
Kaka & Bebe
POSTECH Programming Contest
Kaka & Bebe
- 이 그래프에서 정점 (0, 0)으로부터 시작하는 다익스트라 알고리즘을 시행하자.
- 이로부터 정점 (N-1, 0)부터 (N-1, 1000)까지 해당 정점까지 도달하는데 걸린 최소 c의 합이 나오게 된다.
- (N-1, i) 번 정점까지 도달하는데 걸린 최소 c의 합이 C_i일 때, i * C_i의 최소값을 구하면 문제의 정답이다.
- 새로운 그래프의 정점의 개수는 1000N개, 간선의 개수는 대략 1000M개이다.
- 다익스트라 알고리즘은 정점 V개 간선 E개인 그래프에 대해 O(E + VlogV)의 시간복잡도를 가지므로 시간 내로 답
이 나온다.
2019 PPC
Thank you :-)

More Related Content

What's hot

DP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdfDP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdfHo Jeong Im
 
기본 회전 공식
기본 회전 공식 기본 회전 공식
기본 회전 공식 cancan21st
 
해커에게 전해들은 머신러닝 #3
해커에게 전해들은 머신러닝 #3해커에게 전해들은 머신러닝 #3
해커에게 전해들은 머신러닝 #3Haesun Park
 
[신경망기초] 신경망의시작-퍼셉트론
[신경망기초] 신경망의시작-퍼셉트론[신경망기초] 신경망의시작-퍼셉트론
[신경망기초] 신경망의시작-퍼셉트론jaypi Ko
 
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이NAVER D2
 
Wasserstein GAN 수학 이해하기 I
Wasserstein GAN 수학 이해하기 IWasserstein GAN 수학 이해하기 I
Wasserstein GAN 수학 이해하기 ISungbin Lim
 
Quaternion and Rotation
Quaternion and RotationQuaternion and Rotation
Quaternion and RotationYoung-Min kang
 
확통 회귀분석
확통 회귀분석확통 회귀분석
확통 회귀분석jaypi Ko
 
[신경망기초] 선형회귀분석
[신경망기초] 선형회귀분석[신경망기초] 선형회귀분석
[신경망기초] 선형회귀분석jaypi Ko
 
해커에게 전해들은 머신러닝 #4
해커에게 전해들은 머신러닝 #4해커에게 전해들은 머신러닝 #4
해커에게 전해들은 머신러닝 #4Haesun Park
 
[Probability for machine learning]
[Probability for machine learning][Probability for machine learning]
[Probability for machine learning]강민국 강민국
 
쏙 알고스터디 01
쏙 알고스터디 01쏙 알고스터디 01
쏙 알고스터디 01Jisu Lee
 
2021 2학기 정기 세미나 4주차
2021 2학기 정기 세미나 4주차2021 2학기 정기 세미나 4주차
2021 2학기 정기 세미나 4주차Moonki Choi
 

What's hot (20)

DP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdfDP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdf
 
기본 회전 공식
기본 회전 공식 기본 회전 공식
기본 회전 공식
 
해커에게 전해들은 머신러닝 #3
해커에게 전해들은 머신러닝 #3해커에게 전해들은 머신러닝 #3
해커에게 전해들은 머신러닝 #3
 
Variational AutoEncoder(VAE)
Variational AutoEncoder(VAE)Variational AutoEncoder(VAE)
Variational AutoEncoder(VAE)
 
[신경망기초] 신경망의시작-퍼셉트론
[신경망기초] 신경망의시작-퍼셉트론[신경망기초] 신경망의시작-퍼셉트론
[신경망기초] 신경망의시작-퍼셉트론
 
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이
 
Wasserstein GAN 수학 이해하기 I
Wasserstein GAN 수학 이해하기 IWasserstein GAN 수학 이해하기 I
Wasserstein GAN 수학 이해하기 I
 
Quaternion and Rotation
Quaternion and RotationQuaternion and Rotation
Quaternion and Rotation
 
자료구조01
자료구조01자료구조01
자료구조01
 
자료구조01
자료구조01자료구조01
자료구조01
 
분할정복
분할정복분할정복
분할정복
 
MCMF
MCMFMCMF
MCMF
 
DP 중급 2
DP 중급 2DP 중급 2
DP 중급 2
 
확통 회귀분석
확통 회귀분석확통 회귀분석
확통 회귀분석
 
[신경망기초] 선형회귀분석
[신경망기초] 선형회귀분석[신경망기초] 선형회귀분석
[신경망기초] 선형회귀분석
 
해커에게 전해들은 머신러닝 #4
해커에게 전해들은 머신러닝 #4해커에게 전해들은 머신러닝 #4
해커에게 전해들은 머신러닝 #4
 
03. dp easy
03. dp easy03. dp easy
03. dp easy
 
[Probability for machine learning]
[Probability for machine learning][Probability for machine learning]
[Probability for machine learning]
 
쏙 알고스터디 01
쏙 알고스터디 01쏙 알고스터디 01
쏙 알고스터디 01
 
2021 2학기 정기 세미나 4주차
2021 2학기 정기 세미나 4주차2021 2학기 정기 세미나 4주차
2021 2학기 정기 세미나 4주차
 

Similar to 2019 ppc answers

세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 WinterSuhyun Park
 
Neural network (perceptron)
Neural network (perceptron)Neural network (perceptron)
Neural network (perceptron)Jeonghun Yoon
 
03. linear regression
03. linear regression03. linear regression
03. linear regressionJeonghun Yoon
 
Code로 이해하는 RNN
Code로 이해하는 RNNCode로 이해하는 RNN
Code로 이해하는 RNNSANG WON PARK
 
Deep Learning from scratch 5장 : backpropagation
 Deep Learning from scratch 5장 : backpropagation Deep Learning from scratch 5장 : backpropagation
Deep Learning from scratch 5장 : backpropagationJinSooKim80
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexityskku_npc
 
정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
정수론적 알고리즘 - Sogang ICPC Team, 2020 WinterSuhyun Park
 
하스켈로 알고리즘 문제 풀기 2
하스켈로 알고리즘 문제 풀기 2하스켈로 알고리즘 문제 풀기 2
하스켈로 알고리즘 문제 풀기 2민석 이
 
2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions현정 김
 
03. segment tree
03. segment tree03. segment tree
03. segment tree승혁 조
 
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 WinterSuhyun Park
 
Linear regression
Linear regressionLinear regression
Linear regression전 희천
 
Lecture 2: Supervised Learning
Lecture 2: Supervised LearningLecture 2: Supervised Learning
Lecture 2: Supervised LearningSang Jun Lee
 
04. logistic regression ( 로지스틱 회귀 )
04. logistic regression ( 로지스틱 회귀 )04. logistic regression ( 로지스틱 회귀 )
04. logistic regression ( 로지스틱 회귀 )Jeonghun Yoon
 
RLCode와 A3C 쉽고 깊게 이해하기
RLCode와 A3C 쉽고 깊게 이해하기RLCode와 A3C 쉽고 깊게 이해하기
RLCode와 A3C 쉽고 깊게 이해하기Woong won Lee
 
CVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic Model
CVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic ModelCVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic Model
CVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic Modeljaypi Ko
 
2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdfkd19h
 

Similar to 2019 ppc answers (20)

세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
세그먼트 트리 느리게 업데이트하기 - Sogang ICPC Team, 2020 Winter
 
Neural network (perceptron)
Neural network (perceptron)Neural network (perceptron)
Neural network (perceptron)
 
03. linear regression
03. linear regression03. linear regression
03. linear regression
 
Code로 이해하는 RNN
Code로 이해하는 RNNCode로 이해하는 RNN
Code로 이해하는 RNN
 
Deep Learning from scratch 5장 : backpropagation
 Deep Learning from scratch 5장 : backpropagation Deep Learning from scratch 5장 : backpropagation
Deep Learning from scratch 5장 : backpropagation
 
01. dp hard
01. dp hard01. dp hard
01. dp hard
 
0207 1 gradient
0207 1 gradient0207 1 gradient
0207 1 gradient
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexity
 
정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
정수론적 알고리즘 - Sogang ICPC Team, 2020 Winter
 
하스켈로 알고리즘 문제 풀기 2
하스켈로 알고리즘 문제 풀기 2하스켈로 알고리즘 문제 풀기 2
하스켈로 알고리즘 문제 풀기 2
 
2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions
 
03. segment tree
03. segment tree03. segment tree
03. segment tree
 
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
 
Linear regression
Linear regressionLinear regression
Linear regression
 
Lecture 2: Supervised Learning
Lecture 2: Supervised LearningLecture 2: Supervised Learning
Lecture 2: Supervised Learning
 
04. logistic regression ( 로지스틱 회귀 )
04. logistic regression ( 로지스틱 회귀 )04. logistic regression ( 로지스틱 회귀 )
04. logistic regression ( 로지스틱 회귀 )
 
RLCode와 A3C 쉽고 깊게 이해하기
RLCode와 A3C 쉽고 깊게 이해하기RLCode와 A3C 쉽고 깊게 이해하기
RLCode와 A3C 쉽고 깊게 이해하기
 
CVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic Model
CVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic ModelCVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic Model
CVPR 2022 Tutorial에 대한 쉽고 상세한 Diffusion Probabilistic Model
 
자료구조01
자료구조01자료구조01
자료구조01
 
2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf
 

More from 승혁 조

RSS Live Slider
RSS Live SliderRSS Live Slider
RSS Live Slider승혁 조
 
Parallel binary search
Parallel binary searchParallel binary search
Parallel binary search승혁 조
 
Geometry Algorithms
Geometry AlgorithmsGeometry Algorithms
Geometry Algorithms승혁 조
 
Heavy light decomposition
Heavy light decompositionHeavy light decomposition
Heavy light decomposition승혁 조
 
Advanced segment tree
Advanced segment treeAdvanced segment tree
Advanced segment tree승혁 조
 
L-R network flow
L-R network flowL-R network flow
L-R network flow승혁 조
 
Sqrt(n) algorithm
Sqrt(n) algorithmSqrt(n) algorithm
Sqrt(n) algorithm승혁 조
 
String algorithm
String algorithmString algorithm
String algorithm승혁 조
 
Tree algorithm
Tree algorithmTree algorithm
Tree algorithm승혁 조
 
05. network flow 2
05. network flow 205. network flow 2
05. network flow 2승혁 조
 
05 divide and conquer
05 divide and conquer05 divide and conquer
05 divide and conquer승혁 조
 
04. network flow 1
04. network flow   104. network flow   1
04. network flow 1승혁 조
 
04. binary search
04. binary search04. binary search
04. binary search승혁 조
 
02. binary search tree
02. binary search tree02. binary search tree
02. binary search tree승혁 조
 
02. data structure and stl
02. data structure and stl02. data structure and stl
02. data structure and stl승혁 조
 
01. c and time complexity
01. c and time complexity01. c and time complexity
01. c and time complexity승혁 조
 

More from 승혁 조 (20)

RSS Live Slider
RSS Live SliderRSS Live Slider
RSS Live Slider
 
Parallel binary search
Parallel binary searchParallel binary search
Parallel binary search
 
Geometry Algorithms
Geometry AlgorithmsGeometry Algorithms
Geometry Algorithms
 
FFT
FFTFFT
FFT
 
Heavy light decomposition
Heavy light decompositionHeavy light decomposition
Heavy light decomposition
 
Advanced segment tree
Advanced segment treeAdvanced segment tree
Advanced segment tree
 
L-R network flow
L-R network flowL-R network flow
L-R network flow
 
Sqrt(n) algorithm
Sqrt(n) algorithmSqrt(n) algorithm
Sqrt(n) algorithm
 
NIM game
NIM gameNIM game
NIM game
 
String algorithm
String algorithmString algorithm
String algorithm
 
Tree algorithm
Tree algorithmTree algorithm
Tree algorithm
 
Number theory
Number theoryNumber theory
Number theory
 
06. sorting
06. sorting06. sorting
06. sorting
 
05. network flow 2
05. network flow 205. network flow 2
05. network flow 2
 
05 divide and conquer
05 divide and conquer05 divide and conquer
05 divide and conquer
 
04. network flow 1
04. network flow   104. network flow   1
04. network flow 1
 
04. binary search
04. binary search04. binary search
04. binary search
 
02. binary search tree
02. binary search tree02. binary search tree
02. binary search tree
 
02. data structure and stl
02. data structure and stl02. data structure and stl
02. data structure and stl
 
01. c and time complexity
01. c and time complexity01. c and time complexity
01. c and time complexity
 

2019 ppc answers

  • 1. 2019 PPC 해설 POSTECH Programming Contest
  • 3. POSTECH Programming Contest - 어떻게 하면 신입생들이 더 쉽게 풀 수 있을까? - 어떻게 하면 ICPC Rule에 더 맞게 출제할 수 있을까? 1. 모든 문제를 푼 팀이 없을 것 2. 모든 문제는 한 팀 이상에게 풀릴 것 3. 모든 팀이 한 문제 이상 풀 것 올해의 목표
  • 4. POSTECH Programming Contest - 강병지: A – Scoring Hack, D – Conquering A Castle, G – Team Selection - 임병찬: B – Good Pizza, Great Pizza, E – Delicious Pineapple Pizza, H – Pineapple Advertising, J – Almost-K Increasing Subsequence - 정현식: C – Heights, F – Linear-Feedback Shift Register, I – Kaka & Bebe 문제 출제
  • 5. POSTECH Programming Contest - Dynamic Programming을 사용해서 해결할 수 있다. - DP[x][k][i]를 x점을 k턴 안에, i번의 x2 연산을 사용해서 만들 수 있을 때 true, 그렇지 않을 때 false라고 하자. - 이 경우 D[x][k][i]는 (x >= a and D[x-a][k-1][i] ) (x-a점에서 a점을 더해 x점을 만드는 경우) or (x >= b and D[x-b][k-1][i] ) (x-b점에서 b점을 더해 x점을 만드는 경우) or (x %2 == 0 and i <= k/10 and D[x/2][k-1][i-1] ) (x/2 점에서 점수를 두 배로 해 x점을 만드는 경우) 로 나타난다. - 따라서 각 D[x][k][i]는 O(1)에 계산 가능하다. - 각 D[x][k][i] 를 계산한 뒤에 n <= x < n+a를 만족하는 x 중에서 D[x][k][i]를 만족하는 k의 최솟값을 구하면 답이 된다. A - Scoring Hack Scoring Hack
  • 6. POSTECH Programming Contest - 게임이론 문제이다. - 𝑖=1 𝑛 2−𝑑 𝑖 ≥ 1 인 경우 𝑑𝑖 들의 multiset X를 다음과 같은 두 개의 multiset A, B로 나눌 수 있다. - 𝑑 𝑖∈𝐴 2−𝑑 𝑖 ≥ 1 2 , 𝑑 𝑖∈𝐵 2−𝑑 𝑖 ≥ 1 2 , 𝐴 ∩ 𝐵 = ∅, 𝐴 ∪ 𝐵 = 𝑋 - 증명은 multiset X의 크기 n에 대해 수학적 귀납법을 사용하면 보일 수 있다. D - Conquering A Castle Conquering A Castle
  • 7. POSTECH Programming Contest Conquering A Castle - 반 대 로 𝑖=1 𝑛 2−𝑑 𝑖 < 1 인 경 우 , X 를 A 와 B 두 개 의 multiset 으 로 어 떻 게 나 누 더 라 도 , 𝑑 𝑖∈𝐴 2−𝑑 𝑖 < 1 2 , 𝑑 𝑖∈𝐵 2−𝑑 𝑖 < 1 2 둘 중 하나는 만족한다. - A의 필승 전략은 𝑖=1 𝑛 2−𝑑 𝑖 ≥ 1 인 경우 존재한다. - 군사들을 𝑑 𝑖∈𝐴 2−𝑑 𝑖 ≥ 1 2 , 𝑑 𝑖∈𝐵 2−𝑑 𝑖 ≥ 1 2 , 𝐴 ∩ 𝐵 = ∅, 𝐴 ∪ 𝐵 = 𝑋 를 만족하도록 A와 B, 둘로 나누어서 서로 다른 길에 배치하면 된다. 이 경우 한 턴이 지나고 나면, 다시 𝑖=1 𝑛 2−𝑑 𝑖 ≥ 1 가 만족되므로, 같은 전략을 반복하면 결국 승리하게 된다. - 반대로 B의 필승전략은 𝑖=1 𝑛 2−𝑑 𝑖 < 1인 경우 존재하며 𝑑 𝑖∈𝐴 2−𝑑 𝑖 < 1 2 , 인 경우 B에 있는 군사를 모두 없애고, 그 렇지 않은 경우 A에 있는 군사를 모두 없애 각 턴에서 𝑖=1 𝑛 2−𝑑 𝑖 < 1 조건을 유지시키는 것이다.
  • 8. POSTECH Programming Contest - 어떤 역할군 순서로 팀을 선택할지, 5!개의 경우가 존재한다. - 역할군의 순서가 주어져 있을 때, dynamic programming을 통해, - DP[i][j]를 1~i번째 후보자들에게, 1~j번째의 역할군을 배정할 때 얻을 수 있는 실력의 합의 최댓값이라고 하자. - DP[i][j] = max(DP[i-1][j] (i번째 후보자에게 j번째 역할군을 배정하지 않는 경우), DP[i-1][j-1] + i번째 후보자의 j번째 역할군 실력 (i번째 후보자에게 j번째 역할군을 배정하는 경우)) 로 나타난다. - 따라서 DP[n][5]가 위의 순서로 팀을 선택할 때 얻을 수 있는 실력의 합의 최댓값이고, O(5n)에 구할 수 있다. - 가능한 모든 순서에 대해 계산해서 최댓값을 구하면 O(5!*5*n) 에 실력의 합의 최댓값을 구할 수 있다. G - Team Selection Kaka & Bebe
  • 9. POSTECH Programming Contest - 마름모는 기울어진 정사각형이기 때문에, 대각선의 길이를 𝐶라고 하면, 넓이는 𝐶2 2 다. - 대각선의 길이는 어떻게 구할까? - 모든 점이 𝑦 = 𝑥 + 𝑎1와 𝑦 = 𝑥 + 𝑎2사이에 존재한다면, 𝐶는 𝑎1 − 𝑎2 보다 커야 한다. - 마찬가지로, 모든 점이 𝑦 = 𝑥 + 𝑏1와 𝑦 = 𝑥 + 𝑏2사이에 존재한다면, 𝐶는 𝑏1 − 𝑏2 보다 커야 한다. - 𝐶가 작을수록 넓이가 작아지므로, 𝐶 = max( 𝑎1 − 𝑎2 , 𝑏1 − 𝑏2 ). - 𝑎1, 𝑎2, 𝑏1, 𝑏2는 모두 𝑂(𝑛) 시간 안에 계산해 낼 수 있다. B – Good Pizza, Great Pizza Good Pizza, Great Pizza
  • 10. POSTECH Programming Contest Good Pizza, Great Pizza - 𝐶의 범위는 0이상 40억 이하다. - 𝐶2 은 long long int 범위를 초과할 수 있다! - 𝐶 = 2𝑘라면, 넓이는 2𝑘2 이다. - 𝐶 = 2𝑘 + 1이라면, 넓이는 2𝑘2 + 2𝑘 + 0.5다.
  • 11. POSTECH Programming Contest - 우리는 파인애플과 도우를 한개씩 쌍을 만들어 줘야 한다. 즉, 파인애플과 도우의 매칭이라고 생각할 수 있다. - 적절한 값 h가 있다고 하자. 파인애플과 도우를 Bipartite Matching을 하는데, 파인애플과 도우를 연결할 조건이 “파인애플의 품질 XOR 도우의 품질 ≥ h” 라고 하자. - 만약 매칭이 되면? 최소값이 h 이상이 되게 하는 파인애플과 도우의 쌍이 존재한다. 즉, 답은 h 이상이다. - 만약 매칭이 안되면? 어떻게 해도 최소값이 h 이상이 되게 만들 수 없다. 즉, 답은 h 미만이다. - 즉, h를 기준으로 Binary Search가 가능하다. E – Delicious Pineapple Pizza Delicious Pineapple Pizza
  • 12. POSTECH Programming Contest Delicious Pineapple Pizza - h는 0이상 231 이하므로 Iteration 수는 log 231 = 31번이다. - 각 Iteration마다, Flow Graph를 만들고 Maximum Matching을 구한다.(Bipartite Graph의 Maximum Matching은 Maximum Flow로 구할 수 있다.) - 𝑉 = 𝑂 𝑛 , 𝐸 = 𝑂 𝑛2 , 𝐹 = 𝑂(𝑛)이고 Ford-Fulkerson은 𝑂(𝐹𝐸)의 시간에 동작하므로, 한 Iteration당 𝑂(𝑛3 )의 시간 이 소요된다. - 전체 Time Complexity = 𝑂(31𝑛3 ). 무난하게 AC된다. - 추가) Ford-Fulkerson말고 Dinic Algorithm을 사용할 수 있다. Dinic은 𝑂 𝑉2 𝐸 = 𝑂(𝑛4 )이 소요된다. 하지만, 모 든 capacity가 0 혹은 1이면 Dinic은 𝑂(min 𝑉 2 3, 𝐸 1 2 𝐸)가 걸린다는게 알려져 있다. - 즉, Dinic을 사용할시 Time Complexity = 𝑂(31𝑛 8 3).
  • 13. POSTECH Programming Contest - 핵심 아이디어: 한번 집 a를 들렸다면, 다음에 다시 집 a를 들릴 때, 다시 탐색할 필요가 없다. 왜냐하면, 새로 피자를 좋아하게 된 집은 무조건 0개기 때문이다. - 쿼리를 받으며, 한번도 안들린 집이면 탐색하고, 한번이라도 들린 집이면 0을 출력하고 탐색하지 않는다. - 한번 탐색할때는, 그냥 주위에 있는 집 하나하나 탐색한다. - Time Complexity = 𝑂(𝑁 + 𝑑𝑖 + 𝑄). 𝑑𝑖 = 2𝑀 이므로, 이 알고리즘은 𝑂(𝑁 + 𝑀 + 𝑄)에 동작한다. H – Pineapple Advertising Pineapple Advertising
  • 14. POSTECH Programming Contest - 문제를 간단히 하기 위해, K는 1이고 𝑏𝑖 > 𝑏𝑖+1라고 가정하자. - 그러면, 𝑏1 ≤ 𝑏2 ≤ ⋯ ≤ 𝑏𝑖, 𝑏𝑖+1 ≤ 𝑏𝑖+2 ≤ ⋯ ≤ 𝑏 𝑚이다. - B가 A의 subsequence므로, 적당한 h가 존재해서, 𝑏1~𝑏𝑖는 𝑎1~𝑎ℎ의 subsequence, - 𝑏𝑖+1~𝑏 𝑚은 𝑎ℎ+1~𝑎 𝑛의 subsequence다. - 따라서, 모든 h에 대해, 𝑎1~𝑎ℎ의 LIS의 길이 + 𝑎ℎ+1~𝑎 𝑛의 LIS의 길이의 최대값을 구하면 된다. J - Almost-K Increasing Subsequence Almost-K Increasing Subsequence
  • 15. POSTECH Programming Contest Almost-K Increasing Subsequence - K>1이라면? K+1개의 partition을 만든다! - 수열 A를 서로 겹치지 않는 K+1개의 segment로 나눈다고 하자. - 즉, 𝑎1~𝑎 𝑛 = 𝑎1~𝑎ℎ1 /𝑎ℎ1+1~𝑎ℎ2 /.../𝑎ℎ 𝐾+1~𝑎 𝑛 - Longest Almost-K Increasing Subsequence의 길이는 K+1개의 segment의 LIS 합의 최대값과 같다. - K+1개의 segment의 LIS 합의 최대값은 어떻게 찾을까?
  • 16. POSTECH Programming Contest Almost-K Increasing Subsequence - LIS[s][t] = 𝑎 𝑠~𝑎 𝑡의 LIS의 길이라 정의하자. - DP[s][t] = 𝑎 𝑠~𝑎 𝑛을 t개의 partition을 내었을때 길이의 합의 최대값이라 정의하자. - DP[s][t] = max(DP[h+1][t-1]+LIS[s][h]) - 구해야 하는값: DP[1][K+1] - DP Time Complexity = 𝑂(𝐾𝑛2 ), LIS 배열을 만드는 Time Complexity = 𝑂(𝑛2 log 𝑛) - 총 Time Complexity = 𝑂(𝐾𝑛2 + 𝑛2 log 𝑛)
  • 17. POSTECH Programming Contest - 다양한 풀이가 존재합니다. - 헤론의 공식을 사용하는 풀이와 헤론의 공식을 사용하지 않는 풀이로 나뉩니다. 헤론의 공식이란? 각 변의 길이를 𝑎, 𝑏, 𝑐 라 하자. 𝑠 = 𝑎+𝑏+𝑐 2 로 정의 할 때 넓이 𝑆는 𝑆 = 𝑠 𝑠 − 𝑎 𝑠 − 𝑏 𝑠 − 𝑐 이다. C - Heights Heights
  • 18. POSTECH Programming Contest Heights 풀이 1) 넓이 𝑆에 대해 2𝑆 = 𝑎ℎ 𝑎 = 𝑏ℎ 𝑏 = 𝑐ℎ 𝑐. 즉 𝑎 = 2𝑆 ℎ 𝑎 , 𝑏 = 2𝑆 ℎ 𝑏 , 𝑐 = 2𝑆 ℎ 𝑐 𝑆2 = 𝑠 𝑠 − 𝑎 𝑠 − 𝑏 𝑠 − 𝑐 = 𝑎 + 𝑏 + 𝑐 −𝑎 + 𝑏 + 𝑐 𝑎 − 𝑏 + 𝑐 𝑎 + 𝑏 − 𝑐 16 = 1 16 2𝑆 ℎ 𝑎 + 2𝑆 ℎ 𝑏 + 2𝑆 ℎ 𝑐 − 2𝑆 ℎ 𝑎 + 2𝑆 ℎ 𝑏 + 2𝑆 ℎ 𝑐 2𝑆 ℎ 𝑎 − 2𝑆 ℎ 𝑏 + 2𝑆 ℎ 𝑐 2𝑆 ℎ 𝑎 + 2𝑆 ℎ 𝑏 − 2𝑆 ℎ 𝑐 = 1 ℎ 𝑎 + 1 ℎ 𝑏 + 1 ℎ 𝑐 − 1 ℎ 𝑎 + 1 ℎ 𝑏 + 1 ℎ 𝑐 1 ℎ 𝑎 − 1 ℎ 𝑏 + 1 ℎ 𝑐 1 ℎ 𝑎 + 1 ℎ 𝑏 − 1 ℎ 𝑐 𝑆4 이를 통해 𝑆를 구할 수 있다.
  • 19. POSTECH Programming Contest Heights 풀이 2) - 넓이 𝑆에 대해 2𝑆 = 𝑎ℎ 𝑎 = 𝑏ℎ 𝑏 = 𝑐ℎ 𝑐. 즉 𝑎 = 2𝑆 ℎ 𝑎 , 𝑏 = 2𝑆 ℎ 𝑏 , 𝑐 = 2𝑆 ℎ 𝑐 - 임의로 잡은 어떤 값 𝑥에 대해서, 𝑎′ = 2𝑥 ℎ 𝑎 , 𝑏′ = 2𝑥 ℎ 𝑏 , 𝑐′ = 2𝑥 ℎ 𝑐 라고 하자. - 이를 헤론의 공식에 대입해 얻은 넓이를 𝑦라 하자. 우리가 원하는 값 𝑆는 𝑥 = 𝑦일 때 𝑥이다. - 만약 𝑥 > 𝑦라면, 𝑦는 𝑥2 에 비례하기 때문에 𝑆 > 𝑥이다. 만약 𝑥 < 𝑦라면, 𝑆 < 𝑥이다. - 𝑆의 최소값과 최대값은 문제의 조건에 따라서 대략적으로 구할 수 있다. 이를 통해 𝑥에 대한 이분 탐색을 시행해 𝑆를 구한다.
  • 20. POSTECH Programming Contest Heights 풀이 3) (헤론의 공식 X) - 가장 긴 변을 𝑐라고 하자. - 오른쪽 그림과 같이 수선을 그어 𝑘를 정의할 수 있다. - 𝑐를 추측한 값 𝑥에 대해, 𝑎′ = ℎ 𝑐 ℎ 𝑎 𝑥, 𝑏′ = ℎ 𝑐 ℎ 𝑏 𝑥.𝑐′ = 𝑎′2 − ℎ 𝑐 2 + 𝑏′2 − ℎ 𝑐 2 . - 𝑐값은 𝑐′ = 𝑥일 때 𝑥이다. 𝑐′ − 𝑥 는 𝑥에 대해 단조증가 하기 때문에, 풀이 2와 마찬가지로 𝑥에 대해 이분 탐색이 가능하다. (단조증가에 대한 엄밀한 증명은 생략, 스스로 생각해보세요!) 이외에도 정말 다양한 풀이들이 있음! 𝑎 𝑏 𝑐 𝑘 𝑐 − 𝑘 ℎ 𝑐
  • 21. POSTECH Programming Contest 풀이 1) - 모든 경우의 수를 확인하여, 사전 순으로 가장 빠른 것을 고른다. - 단순하게 풀면 236 이므로 시간 내에 불가능. F - Linear-Feedback Shift Register Linear-Feedback Shift Register
  • 22. POSTECH Programming Contest Linear-Feedback Shift Register 풀이 2) - Meet in the middle을 사용해 풀 수 있다. - 𝑟36 이후의 𝑟𝑖는 결국 𝑟0~𝑟35 중 일부를 XOR한 것이며, 이는 𝑟0~𝑟17에 대한 XOR 식과 𝑟18~𝑟35에 대한 XOR 식으로 나타낼 수 있다. - 이를 수식으로 표현하면, 𝑟𝑖 = 𝑓𝑖(𝑟0, 𝑟1, … , 𝑟17)⨂𝑓𝑖 ′ 𝑟18, 𝑟19, … , 𝑟35 라고 쓸 수 있다. - 이 때, XOR은 𝑎⨂𝑎 = 0이고 𝑎 = 𝑏 ⇔ 𝑎⨂𝑐 = 𝑏⨂𝑐가 성립함에 유의한다.
  • 23. POSTECH Programming Contest Linear-Feedback Shift Register - 𝑟18~𝑟35에 대해 사전 순으로 순회를 돌면서, 𝑟𝑖⨂𝑓𝑖 ′ 𝑟18, 𝑟19, … , 𝑟35 값들을 구하고, 이를 map에 저장한다. (map[ 𝑟𝑖⨂𝑓𝑖 ′ 𝑟18, 𝑟19, … , 𝑟35 ] = 𝑟18 𝑟19 … 𝑟35 , 이미 entry가 있다면 해당 entry가 사전 순으로 더 빠르므로 넘어간다.) - 𝑟0~𝑟17에 대해 사전 순으로 순회를 돌면서, 𝑓𝑖(𝑟0, 𝑟1, … , 𝑟17)를 구한 뒤 map에 entry가 있는지 확인한다. - entry가 있다면 𝑟0~𝑟17와 map[𝑓𝑖(𝑟0, 𝑟1, … , 𝑟17)]을 이어 붙인 것이 답이다. - 답이 존재한다면 𝑟𝑖 = 𝑓𝑖(𝑟0, 𝑟1, … , 𝑟17)⨂𝑓𝑖 ′ 𝑟18, 𝑟19, … , 𝑟35 이므로 𝑟𝑖 ⨂ 𝑓𝑖 ′ 𝑟18, 𝑟19, … , 𝑟35 = 𝑓𝑖(𝑟0, 𝑟1, … , 𝑟17)여야 함에 유의 한다. - 시간 소요는 218 log 218 이다. (map insert/access가 O log 𝑁 이므로)
  • 24. POSTECH Programming Contest - 새로운 그래프를 정의하자. 정점 (v, d)는 원래 그래프의 정점 v까지 도달하는데 경로 상의 Bebe 수가 d마리임을 의미한다. - 원래 그래프는 정점 a와 정점 b를 잇는 (c, d) 가중치를 가지는 간선들로 구성된다. - 이를 새로운 그래프에서는 0≤p≤1000-d인 정수 p에 대해 정점 (a, p)와 정점 (b, p+d)를 잇는 가중치 c의 간선으 로 바꾼다. - 물론 (b, p)와 (a, p+d)도 가중치 c로 이어준다. I - Kaka & Bebe Kaka & Bebe
  • 25. POSTECH Programming Contest Kaka & Bebe - 이 그래프에서 정점 (0, 0)으로부터 시작하는 다익스트라 알고리즘을 시행하자. - 이로부터 정점 (N-1, 0)부터 (N-1, 1000)까지 해당 정점까지 도달하는데 걸린 최소 c의 합이 나오게 된다. - (N-1, i) 번 정점까지 도달하는데 걸린 최소 c의 합이 C_i일 때, i * C_i의 최소값을 구하면 문제의 정답이다. - 새로운 그래프의 정점의 개수는 1000N개, 간선의 개수는 대략 1000M개이다. - 다익스트라 알고리즘은 정점 V개 간선 E개인 그래프에 대해 O(E + VlogV)의 시간복잡도를 가지므로 시간 내로 답 이 나온다.