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