본문 바로가기

Computer Science

(14)
0903 Problem Solving 4문제로 이루어진 셋을 돌았습니다. 결과는 100 / 42 / 0 / 100입니다. 1. JOI2020 Capital City(수도) 30점 (서브테스크 3) : 직관적인 DnC가 보인다. 현재 구간을 [s, e)라고 할 때, mid를 포함하는 답을 생각해보면 순회를 통해 O(N) 혹은 O(NlogN)에 mid를 포함하는 모든 답을 구할 수 있음을 알 수 있다. 또한 어떤 도시가 mid를 사이에 둔다면, 이 도시가 수도로써 동작하기 위해선 mid를 반드시 거쳐야 하므로 mid를 포함하는 답에 포함되게 된다. 따라서 mid가 사이에 없는 도시들로 분리할 수 있고, 이를 통해 DnC가 가능하다. 100점 : 위 방법을 트리에서 정확히 똑같이 하면 된다. 센트로이드 분할을 이용하자. (이 경우엔 한번에 여러 ..
0827 Problem Solving 4문제로 구성된 셋을 돌았습니다. JOI 17 : Long Mansion 먼저, 각 i에 대해 최종 도달 가능 범위를 L[i] ~ R[i]라 하자. 이러한 L[i], R[i]를 모두 구할 수 있다면, 쿼리를 O(1)에 처리 가능하다. 이제 이러한 L[i], R[i]를 구해보자. 10점 (서브테스크 1) : 최대한 왼쪽으로 갔다가 최대한 오른쪽으로 갔다가 ... 구간이 일정해질 때까지(더 이동이 불가능해질 때까지) 반복한다. 가지고 있는 Key의 정보는 std::set으로 관리한다. 시간복잡도는 O(N^2logN + Q)이다. 25점 (서브테스크 2) : Key의 종류가 최대 20개이다. 따라서 이를 비트마스킹하고 bitwise or SegTree를 짜고, 최대한 왼쪽으로 가는 것과 최대한 오른쪽으로 가는..
0826 Problem Solving 푼 시간 순서입니다. BOJ 19265 Is It a p-drome? 간단한 FFT, 해싱 문제이다. 일단 무지성으로 각 부분열에 대해 Rabin Fingerprint를 찍고 생각하자. 순열 p를 순열 사이클 분할을 해 '같아야만 하는 index들'의 집합을 적절히 구한다. 이러한 집합을 적절히 구하고 나면, 만약 부분열이 p-drome일 경우 Rabin FingerPrint를 C라 하면 C = sigma i = 0 ~ M-1 A[i] * B[i] (B[i] = sigma j = 0 ~ M-1, i and j is in same cycle, i is smallest on that cycle : h^j mod p) 와 같은 식이 도출된다. 이는 FFT로 쉽게 구할 수 있고, 이 값이 Rabin Finger..
0825 Problem Solving 2020년 2차 선발고사를 쳐봤습니다. 아이싱 문제는 풀이를 이전에 접한 적이 있어서, 첫 3문제만을 풀었습니다. 결과 : 150 / 43 / 18 1. 마법의 다이얼 먼저 좌표 압축을 한 뒤, 각 다이얼 기준으로 i번째 칸에 다이얼을 모으게 될 때 얼마나 돌려야 할지를 생각해보자. 이는 함수 y = ax + b 꼴들로 나타내어지며, 따라서 각 칸 별로 x의 계수, 상수항을 저장해둔 뒤 prefix sum을 잘 관리해주면 풀 수 있다. 2. 하나 둘 셋 43점 (서브테스크 1, 2) : 먼저 다항식 시간복잡도의 풀이를 위해선 다음과 같은 아이디어를 얻어야 한다. (1, 2, 3) 쌍의 개수와 (3, 2, 1) 쌍의 개수를 정하고 생각해보면, 1과 3의 위치를 그리디하게 선택 가능하고, 무슨 1을 무슨 3..
0823 Problem Solving 2020년도 1차 국가대표 선발고사 시험을 쳐봤습니다. 결과 : 100 / 48 / 47 / 100 1. 문자열 찾기 100점 : S1의 연속된 부분문자열 중 S2와 '사실상 같은' 것의 개수를 구하면 된다. '사실상 같다' 라는 것은 먼저 두 문자열의 길이가 같고, 쌍 (i, j)에 대해 S1[i] == S1[j] S2[i]==S2[j]임을 의미한다. 이는 간단한 해싱으로 가능하다. 알파벳의 개수는 총 26개이므로, 각 26개의 알파벳에 대해 Rabin - Fingerprint를 찍는다. 두 문자열이 '사실상 같다' 이러면 S1, S2에 대해 이 Rabin-Fingerprint의 집합들이 같아야 한다. set으로 비교하거나, 혹은 전체를 xor해서 같으면 같다고 해싱하는 것도 좋은 것 같다. 난 후자로..
0822 Problem Solving 푼 문제들을 정리해 보자. 푼 문제들은 난이도순이 아닌 시간순이다. 08/16 Codeforces Round #814 (Div. 1) 29등을 해 오랜만에 LGM 퍼포를 받았다. A1, A2 : Burenka and Traditions 문제를 잘 분석하면 range가 1인 시행, range가 2인 시행으로 분할할 수 있고 2인 시행을 많이 할 수록 유리하다는 것을 깨달을 수 있다. range 2인 시행을 함으로써 이익이 되기 위하려면 구간 l~r 에 대해 A[l] ^ A[l+1] ^ .. ^ A[r] = 0이어야 하고, 이 구간에서 1만큼의 이득을 얻을 수 있다. 이는 map을 통해 prefix xor값을 C[i]라 하면 prefix xor이 c가 되는 최소의 i를 M[c] = i라고 정의한 다음, 이를..