문제의 일부분은 배열 (RMQ)의 범위에서 최소값을 얻는 것과 관련되어 있으므로 세그먼트 트리를 구현했으며 지금까지는 문제가 없습니다. 그런 다음 원래 배열에서 하나의 항목을 업데이트하고 (둘 이상의 항목이있는 업데이트가 없음) 세그먼트 트리에서 업데이트하려고합니다. 내가 지금까지 할 일은 나뭇잎에 도착할 때까지 세그먼트 트리를 위에서 아래로 가로지 릅니다. 그러나 이것에 약간의 버그가있는 것 같습니다. 다음은 코드의 업데이트 부분입니다. 거기에 잘못된 것 같습니다.
P. N는 2의 배수 (이 솔루션을 영향을 미치는 경우 나도 몰라)
세그먼트 트리에서 한 항목 업데이트
public void update(int i, int k) {
update(i, k, 0, 0, n - 1);
}
/// <summary>
/// update one item in the segment tree
/// </summary>
/// <param name="i">The index of the element to be updated in the original array</param>
/// <param name="k">The new value</param>
/// <param name="j">The current index in the segment tree</param>
/// <param name="from">range start index (inclusive)</param>
/// <param name="to">range end index (inclusive)</param>
private void update(int i, int k, int j, int from, int to) {
tree[j] = Math.Min(tree[j], k);
if (from == to) return;
int mid = from + (to - from)/2;
if (from <= i && mid >= i) {
update(i, k, 2 * j + 1, from, mid);
} else {
update(i, k, 2 * j + 2, mid + 1, to);
}
}
P.S. 아니다 일부 버그가있을 수있는 문제의 다른 부분이 있지만 버그가있을 가능성이 가장 큰 부분입니다.
다음은 의심스러운 것 같습니다. tree [j] = Math.Min (tree [j], k); tree [j]의 이전 값이 손실됩니다. 나무 [j]와 k를 교환하고 싶지 않으십니까? – jdweng
트리 [j]와 k를 바꾸는 것은 무엇을 의미합니까? 트리 배열은 세그먼트 트리 배열입니다. tree [j]가 메인 배열의 값을 수정 한 후 서브 트리의 최소값을 가지기를 원합니다. –
알고리즘을 확인하지 않았습니다. Tree [j]가 비어있는 경우에만 사용중인 코드가 작동합니다. tree [j]에 이미 값이 있으면 결과를 저장하지 않고 기존 값을 대체합니다. – jdweng