Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
Reputeless committed May 1, 2022
1 parent ccb95b1 commit e273c9c
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 29 deletions.
46 changes: 23 additions & 23 deletions 029.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,17 @@ public:
m_lazyNodes.resize((m_size * 2 - 1), 0);
}

// 対象区間 [begin, end) を value に更新する
// クエリ対象区間 [begin, end) を value に更新する
void update(size_t begin, size_t end, int value)
{
// update(対象区間, value, 0, 全区間);
// update(クエリ対象区間, value, 0, 全区間);
update(begin, end, value, 0, 0, m_size);
}

// 対象区間 [begin, end) における最大値を求める
// クエリ対象区間 [begin, end) における最大値を求める
int rangeMax(size_t begin, size_t end)
{
// rangeMax(対象区間, 0, 全区間);
// rangeMax(クエリ対象区間, 0, 全区間);
return rangeMax(begin, end, 0, 0, m_size);
}

Expand Down Expand Up @@ -64,19 +64,19 @@ private:
}
}

// 対象区間 [begin, end) を value に更新する.
// クエリ対象区間 [begin, end) を value に更新する.
// ni: 確認するノードのインデックス. そのノードの管理区間は [sBegin, sEnd)
void update(size_t begin, size_t end, int value, size_t ni, size_t sBegin, size_t sEnd)
{
// 対象区間が管理区間と無関係なら
// クエリ対象区間が管理区間と無関係なら
if ((sEnd <= begin) || (end <= sBegin))
{
return; // 何もしない
}

propagate(ni);

// 管理区間のすべてが対象区間に含まれていれば
// 管理区間のすべてがクエリ対象区間に含まれていれば
if ((begin <= sBegin) && (sEnd <= end))
{
// 現在のノードの遅延評価の値に value をセット
Expand All @@ -87,38 +87,38 @@ private:
return;
}

// update(対象区間, value, 子ノード(左) のインデックス, 子ノード(左) の管理区間)
// update(クエリ対象区間, value, 子ノード(左) のインデックス, 子ノード(左) の管理区間)
update(begin, end, value, (ni * 2 + 1), sBegin, (sBegin + sEnd) / 2);
// update(対象区間, value, 子ノード(右) のインデックス, 子ノード(右) の管理区間)
// update(クエリ対象区間, value, 子ノード(右) のインデックス, 子ノード(右) の管理区間)
update(begin, end, value, (ni * 2 + 2), (sBegin + sEnd) / 2, sEnd);
// 現在のノードの計算済みの値を、子ノード (左, 右) の計算済みの値をもとに更新
m_nodes[ni] = std::max(m_nodes[ni * 2 + 1], m_nodes[ni * 2 + 2]);
}

// 対象区間 [begin, end) における最大値を求める.
// クエリ対象区間 [begin, end) における最大値を求める.
// ni: 確認するノードのインデックス. そのノードの管理区間は [sBegin, sEnd)
int rangeMax(size_t begin, size_t end, size_t ni, size_t sBegin, size_t sEnd)
{
// 対象区間が管理区間と無関係なら
// クエリ対象区間が管理区間と無関係なら
if ((sEnd <= begin) || (end <= sBegin))
{
return 0; // 空の値を返す
}

propagate(ni);

// 管理区間のすべてが対象区間に含まれていれば
// 管理区間のすべてがクエリ対象区間に含まれていれば
if ((begin <= sBegin) && (sEnd <= end))
{
return m_nodes[ni];
}

// rangeMax(対象区間, 子ノード(左) のインデックス, 子ノード(左) の管理区間)
// rangeMax(クエリ対象区間, 子ノード(左) のインデックス, 子ノード(左) の管理区間)
const int lc = rangeMax(begin, end, (ni * 2 + 1), sBegin, (sBegin + sEnd) / 2);
// rangeMax(対象区間, 子ノード(右) のインデックス, 子ノード(右) の管理区間)
// rangeMax(クエリ対象区間, 子ノード(右) のインデックス, 子ノード(右) の管理区間)
const int rc = rangeMax(begin, end, (ni * 2 + 2), (sBegin + sEnd) / 2, sEnd);
return std::max(lc, rc);
Expand Down Expand Up @@ -154,13 +154,13 @@ int main()
// 1 番目 ~ 3 番目の場合 [0, 3)
--L;

// 対象区間の現在の高さ
// クエリ対象区間の現在の高さ
const int oldH = segTree.rangeMax(L, R);
// 対象区間の新しい高さ (+1)
// クエリ対象区間の新しい高さ (+1)
const int newH = (oldH + 1);

// 対象区間の高さを更新する
// クエリ対象区間の高さを更新する
segTree.update(L, R, newH);

// 高さを出力
Expand Down Expand Up @@ -222,13 +222,13 @@ int main()
// 1 番目 ~ 3 番目の場合 [0, 3)
--L;
// 対象区間の現在の高さ
// クエリ対象区間の現在の高さ
const int oldH = segTree.prod(L, R);
// 対象区間の新しい高さ (+1)
// クエリ対象区間の新しい高さ (+1)
const int newH = (oldH + 1);
// 対象区間の高さを更新する
// クエリ対象区間の高さを更新する
segTree.apply(L, R, newH);
// 高さを出力
Expand Down Expand Up @@ -307,13 +307,13 @@ int main()
const auto itLeft = (h.begin() + Ls[i]);
const auto itRight = (h.begin() + Rs[i]);

// 対象区間の現在の高さ
// クエリ対象区間の現在の高さ
const int oldH = *std::max_element(itLeft, itRight);

// 対象区間の新しい高さ (+1)
// クエリ対象区間の新しい高さ (+1)
const int newH = (oldH + 1);

// 対象区間の高さを更新する
// クエリ対象区間の高さを更新する
std::fill(itLeft, itRight, newH);

// 高さを出力
Expand Down
12 changes: 6 additions & 6 deletions 037.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,34 +45,34 @@ public:
}
}

// 対象区間 [begin, end) における最大値を求める
// クエリ対象区間 [begin, end) における最大値を求める
long long query(size_t begin, size_t end) const
{
return query(begin, end, 0, 0, m_size);
}

private:

// 対象区間 [begin, end) における最大値を求める.
// クエリ対象区間 [begin, end) における最大値を求める.
// ni: 確認するノードのインデックス. そのノードの管理区間は [sBegin, sEnd)
long long query(size_t begin, size_t end, size_t ni, size_t sBegin, size_t sEnd) const
{
// 対象区間が管理区間と無関係なら
// クエリ対象区間が管理区間と無関係なら
if ((sEnd <= begin) || (end <= sBegin))
{
return std::numeric_limits<long long>::lowest();
}

// 管理区間のすべてが対象区間に含まれていれば
// 管理区間のすべてがクエリ対象区間に含まれていれば
if ((begin <= sBegin) && (sEnd <= end))
{
return m_nodes[ni];
}

// query(対象区間, 子ノード(左) のインデックス, 子ノード(左) の管理区間)
// query(クエリ対象区間, 子ノード(左) のインデックス, 子ノード(左) の管理区間)
const long long m1 = query(begin, end, (ni * 2 + 1), sBegin, (sBegin + sEnd) / 2);

// query(対象区間, 子ノード(右) のインデックス, 子ノード(右) の管理区間)
// query(クエリ対象区間, 子ノード(右) のインデックス, 子ノード(右) の管理区間)
const long long m2 = query(begin, end, (ni * 2 + 2), (sBegin + sEnd) / 2, sEnd);

return std::max(m1, m2);
Expand Down

0 comments on commit e273c9c

Please sign in to comment.