문제 링크
- http://icpc.me/12858
사용 알고리즘
- Segment Tree
- Lazy Propagation
시간복잡도
- O(Q log N)
풀이
gcd(a, b, c, d, e, …) = gcd(a, abs(b-a), abs(c-b), abs(d-c), abs(e-d), …)와 동일합니다.
그러므로 어떤 구간 [l, r]에 전부 v를 더해주더라도 구간의 양 끝의 변화( l-1과 l의 차이, r과 r+1의 차이 )만 봐주면 됩니다.
원소를 관리해주는 Segment Tree는 구간 업데이트가 들어오기 때문에 Lazy Propagation을 이용해 구현해주고, gcd를 관리해주는 Segment Tree는 한 번의 쿼리마다 두 개의 지점에서만 업데이트하므로 Lazy Propagation을 사용할 필요가 없습니다.
전체 코드
1 |
|