프로그래밍 114

[알고리즘] PBDS

지난 UCPC 2022에 PBDS가 나왔다. 몰랐던 자료구조니까 공부하긴 했는데 이게 생각보다 강력한 것 같다. C++에서 지원하는데 이게 있으면 세그트리를 안짜도 된다.(근데 짜는게 맘편하긴 하다.) 감사한 곳 https://codeforces.com/blog/entry/11080 C++ STL: Policy based data structures - Codeforces codeforces.com 일단 g++에서만 가능하다고 한다.(unfortunately only for the GNU C++) 개념적으로는 set(map)인데 순서를 기록한다고 한다. 특정 수가 몇번째로 큰지, 특정 수보다 작은 수가 몇개 있는지를 구할 수 있는 내장 자료구조이다. 사용하려면 헤더를 따로 인클루드 하고 네임스페이스도 쓰..

[알고리즘] UCPC 2022 예선 후기

건국대학교에서 만난 훌륭한 실력을 가진 팀원들과 함께 UCPC를 참가하였다. 다들 실력이 좋으셔서 5솔이라는 좋은 성적을 거두었다. 팀원 : riroan, aru0504, kth990303 Before Contest 예비소집 문제에서 최근 UCPC에서 A번이 가장 쉽다는 힌트를 주었다. 그래서 올해도 A가 가장 쉬울 것으로 예상해서 누가 A를 풀지 정해야 했는데 kth990303님이 풀겠다고 했다. 어려운 문제도 붙잡고 있는 스타일이어서 확실하게 풀 수 있는 A를 빠르게 풀고 그동안 나와 aru0504님이 다른 문제를 보기로 했다. 나는 대회에서 문제를 딱 보고 10초 안에 풀이가 떠오르지 않으면 넘기는 성격이라 모든 문제 파악하는게 더 좋았는데 잘 된것같다. 00:01 A solve! 대회 시작 후 몇..

[알고리즘] 파이썬 dict, C++ map/unordered_map

우리는 문제를 풀거나 프로그래밍을 할 때 map(unorderd_map), dict을 쓰곤 한다. 키에 무엇이든 넣을 수 있어 편리한 자료구조이지만 사용 시 조심해야 할 부분이 있는 것 같아 포스팅하게 되었다. 감사한 곳 https://codeforces.com/blog/entry/101817 Anti-hash-table test in Python - Codeforces codeforces.com 시간복잡도 기반 python dict(defaultdict) $O(1)$ 해시 C++ map $O(\log{n})$ RB Tree C++ unordered_map $O(1)$ 해시 우선 차이는 위와 같다. dict이랑 unordered_map은 같은 해시 기반이다. 위 표만 보면 $O(1)$이기 때문에 dict..

[알고리즘] 고속 푸리에 변환(Fast Fourier Transform) part. 1

지금까지 고속푸리에변환(이하 FFT)의 원리를 잘 모르고 썼는데 오늘 각잡고 공부해서 깨달았다. 아직 완벽히 이해한건 아닌것 같지만 잊어버리기 전에 남겨놓고자 한다. (쓰다보니 길어져서 파트를 나누었다. part1은 필요한 지식, part2에 FFT 원리에 대해 포스팅한다.) 감사한 곳 https://codeforces.com/blog/entry/43499 https://codeforces.com/blog/entry/43499 codeforces.com FFT는 다항식을 빠르게 계산하는 알고리즘이다. $A(x) = \sum_{i=0}^{n-1} a_ix^i, B(x) = \sum_{i=0}^{n-1} b_ix^i$일 때 $C(x)=A(x)B(x)$를 빠르게 구하는 알고리즘이다. 그냥 단순 알고리즘으로 구..

[알고리즘] Codeforces Round #784 (Div. 4)

전설로만 존재하는 줄 알았던 div. 4가 열린다길래 다른 일 다 뒤로 하고 보러 왔다. 난이도는 백준 기준으로 브론즈 4 ~ 실버 2? 정도 되는 거 같다. 가장 비슷한 사람의 퍼포를 보니 1800 정도 나오는 거 같다. A - Division? [Solved!] 레이팅에 따라서 조건에 해당하는 Division을 출력하는 문제이다. if문을 빠르고 정확하게 타이핑하자! B - Triple [Solved!] 주어진 배열에서 같은 수가 3개 이상 나오는 수가 있는지 출력하는 문제이다. 파이썬 기준으로 Counter, dict, list 등을 사용해 배열에 존재하는 숫자의 개수를 세고 3개 이상이 있다면 출력하면 된다. C - Odd/Even Increments [Solved!] 배열이 주어질 때 다음 연산..

[알고리즘] Codeforces Round #775 (Div. 2, based on Moscow Open Olympiad in Informatics)

C까지 30~40분 안에 풀면 블루 갈 수 있을거 같다. (최대한 틀리지 않고) D부터는 너무 벽이 느껴진다.. A - Game [Solved!] 1인 땅은 밟을 수 있고 0인 땅은 밟을 수 없다. 인접한 땅은 무료로 여러번 이동할 수 있고 그렇지 않은 경우 1회에 한해 $x$코인을 소비하여 $x$만큼 건너 뛸 수 있다. 이때 처음부터 끝까지 가는데 드는 코인의 최솟값을 구하는 문제이다. 0이 없으면 0원, 아니면 가장 왼쪽에서 처음나오는 0의 위치를 가장 오른쪽에서 처음 나오는 0의 위치에서 빼고 1을 더한값이 답이된다. (여론이 안좋은 문제) B - Game of Ball Passing [Solved!] $a_i$를 $i$번째 선수가 패스를 하는 횟수라고 할 때 모든 선수가 패스를 하려면 몇번의 경기..

[알고리즘] Codeforces Round #774 (Div. 2)

요즘 빠른 3솔을 목표로 하고 있는데 이번은 C에서 너무 막혔다. A - Square Counting [Solved!] $n+1$개의 수 $a_1, a_2, ..., a_n, a_{n+1}$이 주어질 때 $0\le a_i < n$이거나 $a_i = n^2$을 만족한다. 그리고 $\sum_{i=1}^{n+1} a_i = s$를 만족하는 $a_i = n^2$의 개수를 구하는 문제이다. $s$에 $n^2$을 최대한 많이 넣으면 된다. 이를 구하려면 $\lfloor \frac{s}{n^2} \rfloor$을 계산하면 된다. B - Quality vs Quantity [Solved!] 수열 $a_1, a_2, \dots, a_n$이 주어지고 각 수를 빨간색, 파란색, 색칠하지 않음 중 하나의 상태로 만들 때 빨간..

[알고리즘] 순열 사이클 분할

백준에 순열 사이클 분할(permutation cycle decomposition)이라는 태그가 있어서 공부를 하게 되었다. 기본적인 개념은 다음과 같다. 어떤 순열 $(a_1, a_2, \dots , a_n)$이 있으면 $a_i = f(i)$인 함수가 있다고 생각해보자. $f^2(i) = f(f(i))$라고 할 때 $i = f^k(i)$인 $1 \le k \le n$을 찾을 수 있다. 그럼 $k$번 연산하는 과정에서 나온 수들을 모으면 $(f(i), f^2(i), \dots, f^k(i))$가 나올 것이고 이것을 하나의 순열 사이클이라고 한다. 순열 사이클 안에 존재하는 원소들은 모두 같은 순열 사이클이 될 것이다. 모든 원소에 대해 수행하면 여러개의 순열 사이클이 나오는데 이를 구하는 것을 순열 사이..

[알고리즘] Codeforces Round #772 (Div. 2)

이번에 4솔을 하여 민트로 복구할 수 있었다. 코드포스가 있던날 백준, 앳코더도 함께 진행해서 좀 힘든하루였다.(백준 4시간, 앳코더 1시간, 코드포스 2시간..) A - Min Or Sum [Solved!] 배열 $a$에서 서로 다른 원소 $a_i, a_j$를 뽑아 $a_i|a_j = x|y$를 만족하면서 $a_i = x, a_j = y$인 연산을 반복할 때 가능한 배열의 합의 최솟값을 찾는 문제이다. $x = a_i|a_j, y = 0$으로 두면 위 조건을 만족한다. 이 연산을 반복해서 하나의 원소에 적용하면 결국 배열은 $a_1|a_2| \dots | a_n, 0,0, \dots , 0$모양이 될 것이다. 이 때가 최소가 된다. B - Avoid Local Maximums [Solved!] 배열의 ..

[알고리즘] Codeforces Round #771 (Div. 2)

민트를 복구할 수 있는 기회였는데 아쉽게 실패하고 말았다. 3솔에 블루퍼포가 나와서 싱글벙글하고 있었는데 B가 TLE로 터져버렸다. 알고보니 sys.stdin.readline을 쓰지 않아 생긴 문제였다. C문제도 같은 이유로 프리테스트에서 TLE가 발생했지만 B에서도 나올줄은 전혀 몰랐다. (두 문제 모두 $O(n)$으로 해결했었다.) 앞으로는 확인을 꼼꼼히 해야겠다. (후에 라인 추가로 AC받긴 했다.) A - Reverse [Solved!] 배열의 중간 일부 구간을 뒤집었을 때 사전순으로 가장 앞서는 배열을 출력하는 문제이다. 인덱스와 배열값이 다른 부분이 나오는 곳부터 그 이후에 나오는 최솟값이 있는 곳까지 뒤집으면 된다. B - Odd Swap Sort [Solved?] 배열에서 연속한 두 원소의..