본문 바로가기

알고리즘/백준 & swacademy108

BOJ 20176 - Needle (FFT) www.acmicpc.net/problem/20176 참고 koosaga.com/263 세 수열 $a,b,c$ 가 주어질 때, $ a_i+c_j=2 * b_k $ 를 만족하는 쌍 $ (i,j,k) $의 개수를 세는 것 x좌표의 범위를 0-60000으로 두고 답을 구하는 식을 만들면 다음과 같다. \[\sum_{x = 0}^{60000} count_b[x] \times \sum_{y = 0}^{2x} (count_a[y] \times count_c[2x-y])\] fft를 이용해서 합성곱을 구할 수 있다. \[conv[i] = \sum_{x = 0}^{i} (count_a[x] \times count_c[i - x])\] 다시 식을 정리하면.. \[\sum_{x = 0}^{60000} (count_b[x].. 2021. 1. 2.
BOJ 17978 - Washer (기하, 수학) www.acmicpc.net/problem/17978 평면의 법선벡터를 활용해야하는 풀어볼만한 기하문제 3차원 공간(r,g,b축)에 최대 100개의 점이 주어진다. 그 어떤 세 점도 한 직선 위에 있지 않고, 그 어떤 네 점도 한 평면 위에 있지 않다. 이 때, 점을 2분할 하는데, 분할방법에 따라서 점수가 달라진다. 최소 점수를 구해라 (접근 1) 중복되는 점이 없는 1차원 공간을 나눈다면 어떤 점을 기준으로 A,B 그룹을 나눈 후에 추가로 기준이 되는 점을 A, B그룹에 넣을 때를 비교하는 방법이 가장 빠르다. (접근 2) 어느 세 점도 같은 직선 위에 있지 않은 2차원 공간을 나눈다면, 어떤 두 점을 기준으로 A,B 그룹을 나눈 후에 추가로 기준이 되는 두 점을 A,B 그룹에 넣을 때를 비교하는 방.. 2020. 12. 5.
BOJ 11003 - 최솟값 찾기 (monotonic queue) https://www.acmicpc.net/problem/11003 풀이참고 https://jason9319.tistory.com/346 길이 n의 배열이 주어질 때, 구간 크기가 L인 모든 구간에서 순서대로 구간 최소값을 구하라 ( $n> n >> l; for (int i = 0; i a[i]; while (!dq.empty() && dq.back().first >= a[i]) dq.pop_back(); dq.push_back({ a[i], i + l }); cout 2020. 8. 12.
BOJ 7469 - K번째 수 ( 머지소트트리, pst ) https://www.acmicpc.net/problem/7469 두가지 방법으로 가능 머지소트트리, 퍼시스턴트세그트리 pst론 구간 k번째 수를 효과적으로 셀 수 있다. (세그먼트트리에서 전체 k번째 수를 세는 것이랑 비슷함) 최대 1e5개의 정수 배열이 주어진다. 배열의 원소는 절대값이 1e9보다 작은 정수이다. 다음 쿼리를 처리 s,e,k : 구간[s,e]의 k번째 수를 출력 - 머지소트트리 머지소트트리를 만든 후, 1. 쿼리마다 -1e9~1e9사이에서 k번째 수가 될 수 있는 최소값을 구한다. 구간에서 x미만의 수의 개수가 k-1개이상인 수 중 최소값을 구해주면 된다. (이분탐색 시 음수범위에 주의) 2. 구간에서 x이상 최소값을 찾아 출력해준다. const int MAX = 2e5 + 4; co.. 2020. 6. 10.