본문 바로가기

전체 글110

2016.6.14 http://codeforces.com/contest/504/problem/E : 답 정하고 점핑하면 Q log^2 N이라 TLE. 양 옆을 커팅해내고 LCA 하듯이 해서 Q log N.http://arc017.contest.atcoder.jp/tasks/arc017_4 : X(i+1)-X(i)로 Segment Tree. GCD(A, B, C) = GCD(A, |A-B|, |B-C|)http://arc048.contest.atcoder.jp/tasks/arc048_c : |∑| ^ [min(L) + (gcd(L(i)-min(L))+1)/2]http://arc049.contest.atcoder.jp/tasks/arc049_d : reverse 이용해서 seg tree하는 것까진 생각했는데 좀 더 생각해보아.. 2016. 6. 15.
Persistent Segment Tree 들어가기 이전에 다음 글이 해당 자료구조에 대해 영어로 잘 설명해 놓았다. Persistent Segment Tree를 이용하는 문제로 BOJ 11932 트리와 K번째 수 문제가 있다. 노드의 개수가 N개이고, 각 정점마다 가중치가 있는 트리가 있을 때에 M개의 쿼리에 대해 두 노드 사이를 잇는 경로 상의 K번째 정점 가중치 값을 출력하는 문제이다. 편의를 위해서 가중치들은 다 좌표압축을 하여 1에서부터 N까지의 값만 가진다고 가정하자. 한 쿼리에 대해서 답을 이분탐색하면서 정한 답을 Ans라고 한다면, 두 정점 u와 v 사이를 잇는 경로에 Ans보다 작거나 같은 원소의 개수를 counting해서 그 개수가 K보다 크다면 Ans를 줄이고, K보다 작으면 Ans를 늘이면 된다. 답을 정하는 데에 O(log.. 2016. 6. 14.
Divide & Conquer Optimization in DP 동적계획법에서의 분할정복 최적화 기법에 대해서 글을 써보려고 한다. 일반적으로 j E1) return; int M = (L1 + R1) / 2; ll res = 0; for (int i = max(S1, M - D); i res) res = T[M] * (M - i) + V[i], opt[M] = i; if (answer < res) answer = res; f(L1, M - 1, S1, opt[M]); f(M + 1, R1, opt[M], E1); } int main() { scanf("%d%d", &N, &D); for (int i = 1; i 2016. 6. 12.
Coder's high 2016 Round 1: Online F번 주저장소와 부저장소 개념을 이용한 Convexhull trick (화질을 720으로 수정하셔야 소스코드가 잘 보여요.) 2016. 6. 8.
트리에서의 Sqrt Decomposition 1) 트리에서 branch를 나눔2) branch를 나누는 기준은 현재 정점에서 자식 노드들이 여럿일 때, 첫 번째 branch는 부모와 x를 잇는 branch와 같다고 하고, 나머지들은 각각 새로운 branch.3) 현재 branch의 길이가 이상이면 cut.그림으로 표현하면 대충 이런 식이 된다.dfs numbering하면서 branch를 나누는 코드는 아래와 같다.cn : branch number, bc : branch에 포함된 노드의 개수, col[x] : x 노드의 branch indexy라는 노드에서 x라는 노드로 올라가면서 일련의 작업을 하는 코드는 아래와 같다. 붉은색 부분에는 branch 전반에 대한 작업, 푸른색 부분에는 특정 노드에 대한 작업을 해주면 된다. 이 코드는 노드와 부모 노.. 2016. 5. 19.