작년 추석 즈음에 BOJ 슬랙에서 jwvg0425님이 같이 대회를 열 분들을 찾고 있다는 말을 들었다. 나도 문제를 출제해보고 싶어서 대회 출제를 하게 되었다! 7문제 중 3문제를 출제했다. 이 글은 그제 대회가 끝나고 후기 겸 작성하는 글이다. (스포일러도 약간 있다!) 대회 URL풀이 K-균등 문자열이 문제는 내가 전부터 생각해 놓았던 문제였고, 어렵지 않게 디스크립션, 데이터와 솔루션을 만들 수 있었다. 커팅 풀이가 통과할 일이 거의 없어서, (O(NM) 다음에 빠른 풀이가 O(NM * 2^N)이었다) 랜덤으로 거의 모든 데이터를 만들었다. 유니언 파인드에서 경로압축을 안 한 풀이가 시간초과가 나는 걸 확인하고 데이터는 더 이상 만들지 않았다. 대회에서 그것 때문에 TLE 난 제출도 있었는데, 뭔가..
요즘 유사코 골드를 돌고 있습니다! Balanced Photo 먼저 소들의 키를 1~N 범위로 압축해줍니다. 그런 뒤 1~N번 소까지 순회하며 BIT를 이용해 키가 $[h_i+1, N]$ 범위에 있는 소들의 합을 $L_i$에 저장합니다. $L_i$를 채운 뒤에는 자신의 키도 BIT에 업데이트해줍니다. $R$ 배열은 순회 순서를 반대로 해서 채워줄 수 있습니다. 이 과정을 모두 마친 뒤 $Min(L_i, R_i) * 2 < Max(L_i, R_i)$를 만족하는 소들의 개수를 세 주면 됩니다. 시간복잡도는 O(NlogN)입니다. 간단한 자료구조 문제였습니다! #include using namespace std; typedef pair pii; pii arr[100009]; int l[100009], tree..
문제 Sparse Table을 통해 문제를 해결할 수 있다. $par_{i, k}$를 $i$번 정점에서 $2^k$번 위로 올라간 정점이라고 정의하면, $par_{i, k} = par_{par_{i, k-1}, k-1}$과 같은 점화식으로 par를 채울 수 있다. 이걸 Sparse Table이라고 하나보다. par 배열을 통해 임의의 정점에서 $K$번 위로 올라간 정점을 $O(logK)$만에 찾을 수 있다. $dist_i$를 루트에서 $i$번 정점까지의 거리라고 정의하면 1번 쿼리의 답은 $dist_u+dist_v-2*dist_{lca(u,v)}$이다. 2번 쿼리는 $K$번째 정점이 어디에 위치하는가만 알면 Sparse Table로 $K$번째 정점을 찾을 수 있다. $K$번째 정점이 $u$와 $LCA(u,..