数列分块技術の入門と問題解説
数列分块入门 1
長さ n の数列を管理し、区間加算と単一点クエリを行う。
解法
ブロックサイズを sqrt(n) に設定し、各ブロックに対して遅延評価を使用する。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 50000 + 1, SQR = 231;
int a[MAXN], bel[MAXN];
int tag[SQR], lp[SQR], rp[SQR];
void updateBlock(int l, int r, int val) {
...
7月7日 18:04 投稿
主要アルゴリズムとデータ構造の実践: セグメントツリー、ハンガリー法、素因数分解Union-Find
競技プログラミング問題解決のヒント
競技プログラミングでは、時間計算量の制約をクリアするために効率的なアルゴリズムやデータ構造の理解が不可欠です。以下に、いくつかの実践的なアプローチとコード例を紹介します。
繰り返しの多いクエリに対する前計算(累積和)
多数のクエリに対して同じ計算を繰り返す場合、事前に結果を前計算しておくことで、各クエリの処理時 ...
6月21日 22:28 投稿
線分木を使用した複雑な操作の実装
この問題では以下の4つの操作を実装する必要があります:
操作1: 結果にaを加算
操作2: 結果からaを減算
操作3: 結果にaを乗算
操作4: 結果にa * Xを加算
これらの操作を効率的に処理するために、線分木を使用します。線分木は区間最大値と最小値、加算の遅延評価タグ、乗算の遅延評価タグ、代入の遅延評価タグ、および操作4用の遅延評価タグを管理します。
木の構築
通 ...
6月12日 18:13 投稿