Sparse table: различия между версиями
Перейти к навигации
Перейти к поиску
Ctrlalt (обсуждение | вклад) Нет описания правки |
Ctrlalt (обсуждение | вклад) Нет описания правки |
||
| (не показана 1 промежуточная версия этого же участника) | |||
| Строка 7: | Строка 7: | ||
lg.resize(a.size() + 1); | lg.resize(a.size() + 1); | ||
for (int i = 2; i <= a.size(); i++) | for (int i = 2; i <= a.size(); i++) | ||
lg | lg[i] = lg[i / 2] + 1; | ||
st.push_back(a); | st.push_back(a); | ||
for (int level = 1, levelWidth = 2; levelWidth <= a.size(); level++, levelWidth *= 2) { | for (int level = 1, levelWidth = 2; levelWidth <= a.size(); level++, levelWidth *= 2) { | ||
st.emplace_back(); | st.emplace_back(); | ||
for (int i = 0; i + | for (int i = 0; i + levelWidth <= a.size(); i++) | ||
st[level].push_back(min(st[level - 1][i], st[level - 1][i + levelWidth / 2])); | st[level].push_back(min(st[level - 1][i], st[level - 1][i + levelWidth / 2])); | ||
} | } | ||
Текущая версия от 00:34, 18 мая 2023
class SparseTable {
vector<int> lg;
vector<vector<int>> st;
public:
SparseTable(vector<int> &a) {
lg.resize(a.size() + 1);
for (int i = 2; i <= a.size(); i++)
lg[i] = lg[i / 2] + 1;
st.push_back(a);
for (int level = 1, levelWidth = 2; levelWidth <= a.size(); level++, levelWidth *= 2) {
st.emplace_back();
for (int i = 0; i + levelWidth <= a.size(); i++)
st[level].push_back(min(st[level - 1][i], st[level - 1][i + levelWidth / 2]));
}
}
int getMin(int l, int r) {
int level = lg[r - l + 1], levelWidth = 1 << level;
return min(st[level][l], st[level][r - levelWidth + 1]);
}
};
Ссылки
Теория:
- adilet.org — Sparse Table
- neerc.ifmo.ru/wiki — Решение RMQ с помощью разреженной таблицы
- algorithmica.org — Sparse table
- Codeforces — 2D Range minimum Query in O(1)
Код:
Задачи:
- informatics.mccme.ru — Курс «Структуры данных» — часть 10
- Codeforces #100093.E — Разреженные таблицы (Базовая реализация)
- Codeforces #100255.A — Грибы (Базовая реализация)