rkm0959, jhhope1이랑 진행한 문제풀이의 간략한 풀이. 스포일러에 주의하자.

BOJ 15313. 정과프 해적단

[l,r][l, r] 값이 없는 문제는 좌표압축 + 세그먼트 트리를 이용한 dp로 O(nlogn)O(n\log n)에 해결할 수 있다. 이 때 ll이 증가할수록 조건을 만족하기 위해 필요한 최소의 rr도 증가하므로 inchworm을 얹어주면 O(n2logn)O(n^{2}\log n)이 된다.

BOJ 15504. 프로그래밍 대결

제일 실력이 높은 선수를 제외하고, 각 선수마다 ‘자신을 이기는 선수’를 정해주면 스패닝 트리가 유일하게 결정된다. 해당 작업을 mcmf로 모델링하면 O(n4)O(n^{4}). 늘 그렇듯 플로우 문제에서 시간복잡도는 아무 의미 없다.

BOJ 17101. Dynamic Centroid

트리 TT에 리프가 하나 추가된 TT’의 경우, 센트로이드는 변하지 않거나 최대 한 칸 움직인다. 움직인다면 어떤 서브트리 방향으로 움직일지를 정해주면 되는데, 결국 서브트리 사이즈를 dynamic하게 정해줄 필요를 느낀다. 오일러 투어와 펜윅 트리를 이용해서 구해주면 O(nlogn)O(n\log n). 좋은 문제인듯.

BOJ 10916. Xtreme GCD Sum

구해야 할 식은 결국 g=1106ϕ(g)i=1n(bigai1g)\sum_{g = 1}^{10^{6}} \phi(g)\prod_{i=1}^{n}\left(\lfloor \frac{b_{i}}{g} \rfloor - \lfloor \frac{a_{i} - 1}{g} \rfloor\right)가 된다. 위 식이 바뀌는 지점은 많아야 O(nX)O(n\sqrt{X})개 있으므로, ϕ(n)\phi(n)합 테이블이랑 같이 들고다니면 O(XlogX+nX)O(X\log X + n\sqrt{X})가 된다.

BOJ 17975. Strike Zone

KOI 2014 금광으로 O(n2logn)O(n^{2}\log n).

BOJ 13518. 트리와 쿼리 9

트리에서 MO’s algorithm을 돌리는 문제이다. 길이 2n2n의 오일러 투어를 먼저 얻은 뒤, 정점 vv가 탐색되는 시점을 d[v]d[v], 정점 vv에서 빠져나가는 시점을 f[v]f[v]라고 하자. 쿼리가 되는 경로 uvu \to v를 두 가지로 나누어 생각해보자. 편의상 d[u]<d[v]d[u] < d[v]를 가정한다.

  1. lca(u,v)=u\text{lca}(u,v) = u 인 경우, [d[u],d[v]][d[u], d[v]]의 구간을 생각하면 경로 위의 점들은 홀수 번, 경로 밖의 점들은 짝수 번 등장한다.
  2. lca(u,v)=x\mathrm{lca}(u,v) = x인 경우, [f[u],d[v]][f[u], d[v]]의 구간을 생각하자. 그럼 xx를 제외하고 경로 위의 점들은 홀수 번, 경로 밖의 점들은 짝수 번 등장한다. 유일하게 xx는 등장하지 않으므로, xx를 따로 처리해 주면 된다.

결국 어떤 수가 등장하는 횟수의 ‘기우성’이 중요하게 되고, XOR의 느낌으로 자료구조를 관리하는 MO’s algorithm 문제가 된다. 시간복잡도 O(QN)O(Q\sqrt{N}).

BOJ 8452. 그래프와 쿼리

쿼리를 역순으로 생각하면 간선 추가 쿼리와 최단경로 쿼리가 있는 셈이 된다. 최단 경로 쿼리를 매번 BFS를 이용하여 구해주면 되는데, 나이브하게 구하면 O(Q(V+E))O(Q(V + E))가 된다. 그런데 uvu \to v 간선이 추가될 때 uu에서 나가는 간선들만 최단경로를 갱신해준다고 생각하자. unit graph라는 특성상 각 노드에 도달하는 최단경로 길이가 갱신되는 건 많아야 VV번이므로, 이 노드가 BFS를 전파하는 건 O(Vodeg(v))O(V \cdot \mathrm{odeg}(v))번이 된다. 이를 모든 노드에 대해 합하면 O(Q+VE)O(Q + VE).

BOJ 16027. Global Warming

한 원소를 dd만큼 증가시켰다면 그 뒤의 원소를 증가시키지 않을 이유가 없다. 그리고 d=xd = x로 고르는 게 항상 유리하다. 따라서 각 ii에 대해 [i,n][i, n] 구간을 xx만큼 들었을 때 LIS의 길이를 관리해주면 O(nlogn)O(n\log n).

BOJ 19568. 직사각형

약 팔기 (2). 귀여운 문제다.