Sparse table: различия между версиями

Материал из Олимпиадное программирование в УлГТУ
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
Строка 1: Строка 1:
  class SparseTable {
  class SparseTable {
     int lg[100010], st[20][100010];
     vector<int> lg;
    vector<vector<int>> st;
  public:
  public:
     SparseTable(int a[], int size) {
     SparseTable(vector<int> &a) {
         for (int i = 0; i <= size; i++)
        lg.push_back(0);
             lg[i] = (i > 1 ? lg[i / 2] + 1 : 0);
         for (int i = 1; i <= a.size(); i++)
         for (int p = 0; (1 << p) <= size; p++) {
             lg.push_back(lg[i / 2] + 1);
             for (int i = 0; i + (1 << p) <= size; i++)
                 st[p][i] = (p ? min(st[p - 1][i], st[p - 1][i + (1 << p - 1)]) : a[i]);
        st.push_back(a);
         for (int level = 1, levelWidth = 2; levelWidth <= a.size(); level++, levelWidth *= 2) {
            st.emplace_back();
             for (int i = 0; i + (1 << level) <= 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 getMin(int l, int r) {
         int p = lg[r - l + 1];
         int level = lg[r - l + 1], levelWidth = 1 << level;
         return min(st[p][l], st[p][r - (1 << p) + 1]);
         return min(st[level][l], st[level][r - levelWidth + 1]);
     }
     }
  };
  };
== Ссылки на задачи ==
* [http://codeforces.ru/gym/100093/problem/E Codeforces #100093.E &mdash; Разреженные таблицы] (Базовая реализация)
* [http://codeforces.ru/gym/100255/problem/A Codeforces #100255.A &mdash; Грибы] (Базовая реализация)


== Ссылки ==
== Ссылки ==
Строка 30: Строка 33:
Задачи:
Задачи:
* [http://informatics.mccme.ru/course/view.php?id=18 informatics.mccme.ru &mdash; Курс &laquo;Структуры данных&raquo; &mdash; часть 10]
* [http://informatics.mccme.ru/course/view.php?id=18 informatics.mccme.ru &mdash; Курс &laquo;Структуры данных&raquo; &mdash; часть 10]
* [http://codeforces.ru/gym/100093/problem/E Codeforces #100093.E &mdash; Разреженные таблицы] (Базовая реализация)
* [http://codeforces.ru/gym/100255/problem/A Codeforces #100255.A &mdash; Грибы] (Базовая реализация)


[[Category:Структуры данных для задач RSQ/RMQ]]
[[Category:Структуры данных для задач RSQ/RMQ]]

Версия от 04:08, 26 декабря 2021

class SparseTable {
    vector<int> lg;
    vector<vector<int>> st;

public:
    SparseTable(vector<int> &a) {
        lg.push_back(0);
        for (int i = 1; i <= a.size(); i++)
            lg.push_back(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 + (1 << level) <= 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]);
    }
};

Ссылки

Теория:

Код:

Задачи: