본문 바로가기

알고리즘 문제풀이

고속 푸리에 변환(FFT)의 빠른 구현체 PS에서 고속 푸리에 변환(Fast Fourier Transform, FFT)을 쓰는 문제를 이따금씩 볼 수 있다. 컨볼루션은 주파수 영역에서 원소별 곱 연산(elementwise multiplication)으로 바뀌는 특성을 기반으로, FFT를 통해 \(O(n^2)\) 대신 \(O(n \lg n)\) 시간에 컨볼루션이 가능함을 이용하는 문제들이다. FFT는 크게 Cooley-Tukey, Split-Radix, Tangent의 세 가지 방법이 있다. Cooley-Tukey가 가장 간단하지만 비교적 느리고, Tangent가 가장 빠르지만 구현이 가장 복잡하다. 따라서 PS에서는 Cooley-Tukey를 쓰는 것이 일반적이다. 하지만 Cooley-Tukey는 구현 방법에 따라 실행 시간의 편차가 크게 수십 .. 더보기
SCPC 2020 2차예선 + 본선 후기 2차예선 후기 1,2번은 쉬운 문제라 빨리 풀고 3번을 잡았는데, \(O(N \lg N)\) 풀이를 구현해도 계속 시간초과가 났다. 스플레이 트리, 평방 분할, multiset 등 다양한 구현체를 계속 시도해보다가, 계속 TLE가 발생하길래 로컬에서 벤치마크를 시도했더니 100개 테스트 케이스를 돌리면 6초를 넘어서 한 15초 내외가 나왔다. 상수커팅이란 느낌이 들어서 좌표압축을 하고 압축된 좌표로 세그먼트 트리를 돌렸더니 7-8초 내외가 나왔다. 여기서 다시 좌표압축을 할 때 정렬하는 과정을 counting sort로 바꿨더니 3-4초로 줄었다. 이걸 제출해서 AC를 받았다. 문제는 삽질을 너무 많이 해서 3번을 AC 받은 시간이 오후 7시가 넘었다는 점. 그래서 일단 5번 부분점수 37점을 확보해서 .. 더보기
POI 18회 스테이지3 문제2. Monotonicity 2 문제 설명 https://www.acmicpc.net/problem/8195 풀이 * 아래 풀이는 POI 공식 사이트에서 볼 수 있는 풀이(폴란드어로 쓰여 있음)를 참조했습니다. (https://oi.edu.pl/) 1. 개요 우리가 해결할 문제는, 주어진 수열 \(a_1, a_2, \dots, a_n\)의 부분수열 \(a_{b_1}, a_{b_2}, \dots, a_{b_k}\) 중, 모든 \(1 \le i \le n-1\)에 대해 \(i\)번째 항과 \(i+1\)번째 항 사이에 \(a_{b_i} \,\langle s_i \rangle\, a_{b_{i+1}}\)이 성립하는 것 중 가장 긴 것을 찾는 것이다. 여기서 \(\langle s_i \rangle \)는 부등호 또는 등호인 \(s_i\)를 \(.. 더보기
SCPC 2017 2차예선 5번 풀이. 자석 문제 설명 \(N\)개의 폐구간에 대해, 각 구간 \(i\) (\(1 \le i \le N\))의 끝점 \(L[i]\), \(R[i]\)가 주어진다. 또한, 각 구간의 활성화 비용 \(W[i]\)가 주어진다. 하나의 구간 \(i\)를 비용 \(W[i]\)를 들여 활성화하면, 이 구간은 '활성구간'이 되고, 구간 \(i\) 및 구간 \(i\)와 한 점이라도 겹치는 모든 구간이 '커버'된다. 각 구간은 하나 이상의 구간에 의해 커버될 수 있다. 모든 구간을 커버하기 위한 최소 비용을 구하면? 제한조건: \(N \le 100,000\), \(0 \le L[i], R[i] \le 10^9\), \(1 \le W[i] \le 10^5\) 실행조건: 90개 이하 테스트 케이스에 대한 실행시간 총합 3초 이내 (자세.. 더보기
SCPC 2020 1차예선 5번 구현 소스 코드 풀이 설명은 https://paido.tistory.com/21을 참고해 주세요. 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 .. 더보기
SCPC 2020 1차예선 4번 구현 소스 코드 풀이 설명은 https://paido.tistory.com/21을 참고해 주세요. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531.. 더보기
SCPC 2020 1차예선 풀이, 후기 올해 SCPC는 작년보다 푸는 시간이 더 빨라진 것 같다! 알고리즘에 따라 나누어 보면 1번 그리디, 2번 DP, 3번 DP, 4번 세그먼트 트리, 5번 기하가 출제되었다. 구현 소스 코드 링크: 1번, 2번, 3번, 4번(별도의 글), 5번(별도의 글) 문제 1. 다이어트 설명 길이 \(N\)인 두 수열 \(A[1..N]\), \(B[1..N]\)이 주어져 있을 때, 두 수열에서 숫자를 각각 하나씩 뽑아 순서쌍 \((A[i], B[j])\)를 만드는 작업을 \(K\)번 반복하였다. 만들어진 \(K\)개의 순서쌍에서 두 수의 합의 최댓값을 최소화하도록 순서쌍들을 뽑으면 그 값은 얼마인가? (단, 한 번 쓴 수는 다시 쓰지 않는다.) 제한조건: \(1 \le N \le 200,000\), \(1 \le K.. 더보기
SCPC 2019 본선 5번 풀이. 정육면체 재구성 문제 설명(요약) 3차원 공간에 \(N\)개의 점 \(P_1(x_1,y_1,z_1)\), \(\cdots\), \(P_N(x_N,y_N,z_N)\)이 주어져 있다. (정수좌표) 다음 조건을 만족하는 두 정육면체 \(Q\), \(Q'\)을 생각하자. \(Q\)와 \(Q'\)의 중심은 서로 일치한다. 주어진 \(N\)개의 점은 \(Q\)의 내부 또는 경계에 있으며, 동시에 \(Q'\)의 외부 또는 경계에 있다. 즉, \(Q\)는 바깥쪽 정육면체이고 \(Q'\)은 안쪽 정육면체이다. \(Q\)와 \(Q'\)의 한 변 길이의 차이의 최솟값을 구하시오. 제약 조건: \(N \le 15,000\), \(-10^9 \le x_i, y_i, z_i \le 10^9\) 실행 조건: 테스트 케이스 50개에 대한 실행시간 .. 더보기