A0=U0=V0=0으로 둔다. 위치 i를 덮고 있는 크기 1의 시행 수를 Ui, 크기 X의 시행 수를 Vi라고 하자. 그러면
Ui+XVi=Ai
이며 Ui,Vi는 음이 아닌 정수이다.
고정된 두 수열 U,V를 만드는 데 필요한 시행 수는
i=1∑Nmax(0,Ui−Ui−1)+i=1∑Nmax(0,Vi−Vi−1)
이다. 증가한 만큼 새 구간을 시작하고, 감소한 만큼 기존 구간을 끝내면 이 값을 달성할 수 있다.
Fi(c)를 1번부터 i번 위치까지 만들었고 Vi=c일 때의 최소 비용이라고 하자. Δi=Ai−Ai−1이고 이전 상태가 d라면 e=c−d에 대한 전이 비용은
hΔi(e)=max(0,Δi−Xe)+max(0,e)
이다. 또한 0≤c≤⌊Ai/X⌋이어야 한다. 따라서 Fi는 정수 이산 볼록 함수이다.
정수 이산 볼록 함수 f의 켤레 함수를
f∗(s)=zmax(sz−f(z))
로 정의한다. 1≤j≤X+1에 대해
Dj(f)=f∗(−X+j)−f∗(−X+j−1)
로 둔다. Dj(f)는 기울기 −X+j에서의 가장 작은 최적 위치이다.
다음 성질을 사용한다.
- infimal convolution에서는 켤레 함수가 더해진다. 따라서 Dj도 더해진다.
- 함수의 정의역을 정수 구간 [0,q]로 제한하면 Dj는 clamp(Dj,0,q)가 된다.
- hΔ∗(−X)=−Δ이다.
Δ=Xq+r (0≤r<X)로 둔다. dj(Δ)=Dj(hΔ)는 다음과 같다.
Δ≥0이면
d1=0,dj=q+[r≥X−j+2](2≤j≤X+1).
Δ<0이면
dj=q+[r≥X−j+1](1≤j≤X),dX+1=0.
여기서 대괄호는 조건이 참이면 1, 거짓이면 0이다. 이 식은 hΔ(e)−(−X+j)e의 이산 기울기를 조사하여 얻을 수 있다.
zj=Dj(Fi−1)+dj(Δi)라고 하자. qi=⌊Ai/X⌋일 때
Dj(Fi)=clamp(zj,0,qi)
이다. 또한 αi=Fi∗(−X)라 두면
αi=αi−1−Δi+j=1∑X+1min(zj,0)
이다.
항상 D1(Fi)=0, DX+1(Fi)=qi이며 j=X+1 상태가 α에 더하는 값은 항상 0이다. 따라서 j=2,3,⋯,X의 X−1개 상태만 저장하면 된다. j=1 상태가 α에 더하는 값은 각 위치의 상수항에 합칠 수 있다.
이제 하나의 상태 j를 고정하자. 한 위치는 입력 상태 x를
y=clamp(x+d,0,q)
로 바꾸고, α에 min(x+d,0)을 더한다.
연속한 구간의 효과는 다음 다섯 정수로 표현할 수 있다.
y=clamp(x+a,l,r),t=min(x+p,c).
여기서 t는 이 구간이 α에 더하는 값이다. 한 위치의 요약은
(a,l,r,p,c)=(d,0,q,d,0)
이다.
왼쪽 요약을 (a1,l1,r1,p1,c1), 오른쪽 요약을 (a2,l2,r2,p2,c2)라고 하자. 왼쪽 다음에 오른쪽을 적용한 요약은
alrpc=a1+a2,=clamp(l1+a2,l2,r2),=clamp(r1+a2,l2,r2),=p1+min(l1+p2,c2),=c1+min(r1+p2,c2)
이다. 각 상태를 독립적으로 합칠 수 있으므로 세그먼트 트리 노드의 병합에는 O(X)의 시간이 든다.
루트에서 입력 상태는 모두 0이다. 각 상태의 최종값은 clamp(a,l,r)이고, α에 더해지는 값은 min(p,c)이다. 마지막으로
cminFN(c)=−FN∗(0)=−(αN+j=2∑XDj(FN))
를 출력한다.
모든 쿼리를 먼저 읽는다. 쿼리에서 한 번이라도 갱신되는 위치를 p라고 하면 바뀔 수 있는 전이는 p번과 p+1번뿐이다. 이 전이들의 위치 집합을 S라고 하자. ∣S∣≤2Q이다.
S에 속하지 않는 위치는 모든 쿼리 동안 변하지 않는다. 이러한 위치의 각 최대 연속 구간을 처음에 하나의 요약으로 합친다. S의 각 위치는 길이 1인 요약으로 둔다. 이렇게 만든 압축 수열의 길이를 K라고 하면
K≤2∣S∣+1≤4Q+1
이다. 압축 수열 위에 세그먼트 트리를 만든다. 한 번의 업데이트에서는 p번과 p+1번에 대응하는 압축 리프만 다시 만든다.
전처리 시간 복잡도는 O(X(N+Q)+QlogQ)이고, 쿼리당 시간 복잡도는 O(XlogQ)이다. 메모리 복잡도는 O(N+Q+XQ)이다.
Solution written by GPT5