🗊Презентация Introduction to Segment tree

Нажмите для полного просмотра!
Introduction to Segment tree, слайд №1Introduction to Segment tree, слайд №2Introduction to Segment tree, слайд №3Introduction to Segment tree, слайд №4Introduction to Segment tree, слайд №5Introduction to Segment tree, слайд №6Introduction to Segment tree, слайд №7Introduction to Segment tree, слайд №8Introduction to Segment tree, слайд №9Introduction to Segment tree, слайд №10Introduction to Segment tree, слайд №11Introduction to Segment tree, слайд №12Introduction to Segment tree, слайд №13Introduction to Segment tree, слайд №14

Вы можете ознакомиться и скачать презентацию на тему Introduction to Segment tree. Доклад-сообщение содержит 14 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Introduction to Segment tree.
Описание слайда:
Introduction to Segment tree.

Слайд 2





Дерево отрезков — это структура данных, которая позволяет за асимптотику O(log n) реализовать любые операции, определяемые на множестве, на котором данная операция ассоциативна, и существует нейтральный элемент относительно этой операции.
Дерево отрезков — это структура данных, которая позволяет за асимптотику O(log n) реализовать любые операции, определяемые на множестве, на котором данная операция ассоциативна, и существует нейтральный элемент относительно этой операции.
Но стоит заметить, что класс задач, решаемых с помощью дерева отрезков, намного больше.
Segment tree – is a data structure that allows to implement operations on the interval in O(log n).
The operation should have an associative property
and have a neutral element
Описание слайда:
Дерево отрезков — это структура данных, которая позволяет за асимптотику O(log n) реализовать любые операции, определяемые на множестве, на котором данная операция ассоциативна, и существует нейтральный элемент относительно этой операции. Дерево отрезков — это структура данных, которая позволяет за асимптотику O(log n) реализовать любые операции, определяемые на множестве, на котором данная операция ассоциативна, и существует нейтральный элемент относительно этой операции. Но стоит заметить, что класс задач, решаемых с помощью дерева отрезков, намного больше. Segment tree – is a data structure that allows to implement operations on the interval in O(log n). The operation should have an associative property and have a neutral element

Слайд 3





The Basic idea of a segment tree
Описание слайда:
The Basic idea of a segment tree

Слайд 4





Рассмотрим пример реализации дерева отрезков для следующих запросов:
Рассмотрим пример реализации дерева отрезков для следующих запросов:
	1) Добавить к i-му элементу значение d
	2) Получить сумму на отрезке [l;r]
The Example of queries for the segment tree:
To add a value d to the value of i-th element
To get sum on the segment [l;r]
Описание слайда:
Рассмотрим пример реализации дерева отрезков для следующих запросов: Рассмотрим пример реализации дерева отрезков для следующих запросов: 1) Добавить к i-му элементу значение d 2) Получить сумму на отрезке [l;r] The Example of queries for the segment tree: To add a value d to the value of i-th element To get sum on the segment [l;r]

Слайд 5





Creating structure
struct Tree
{
	vector<int> t;
	int size;
};
Описание слайда:
Creating structure struct Tree { vector<int> t; int size; };

Слайд 6





Initialization of the tree
	void init(vector<int> &a){
		size = 1;
		while(size <= n) size *= 2;
		t.resize(2 * size, 0); //0 – neutral element for “+”
		for (int i = 0; i < (int)a.size(); i++)
			t[i + size] = a[i];
		for (int i = size - 1; i > 0; i--)
			t[i] = t[2*i]+t[2*i+1];
	}
Описание слайда:
Initialization of the tree void init(vector<int> &a){ size = 1; while(size <= n) size *= 2; t.resize(2 * size, 0); //0 – neutral element for “+” for (int i = 0; i < (int)a.size(); i++) t[i + size] = a[i]; for (int i = size - 1; i > 0; i--) t[i] = t[2*i]+t[2*i+1]; }

Слайд 7





The change request
	void change(int v, int tl, int tr, int i, int d){
		if (tl == tr){
			t[v] += d;
			return;
		}
		int mid = (tl + tr) / 2;
		if (i <= mid) change(2*v, tl, mid, i, d);
		else change(2*v+1, mid + 1, tr, i, d);
		t[v] = t[2*v] + t[2*v+1];
	}
	
	change(1, 0, size - 1, i, d); //Start
Описание слайда:
The change request void change(int v, int tl, int tr, int i, int d){ if (tl == tr){ t[v] += d; return; } int mid = (tl + tr) / 2; if (i <= mid) change(2*v, tl, mid, i, d); else change(2*v+1, mid + 1, tr, i, d); t[v] = t[2*v] + t[2*v+1]; } change(1, 0, size - 1, i, d); //Start

Слайд 8





Getting sum
	int sum(int v, int tl, int tr, int l, int r){
		if (l > r) return 0;
		if (tl == l && tr == r){
			return t[v];
		}
		int mid = (tl + tr) / 2;
		int left_sum = sum(2*v, tl, mid, l, min(r, mid));
		int right_sum = sum(2*v+1, mid+1, tr, max(l, mid+1), r);
		return left_sum + right_sum;
	}
	
	sum(1, 0, size - 1, l, r);
Описание слайда:
Getting sum int sum(int v, int tl, int tr, int l, int r){ if (l > r) return 0; if (tl == l && tr == r){ return t[v]; } int mid = (tl + tr) / 2; int left_sum = sum(2*v, tl, mid, l, min(r, mid)); int right_sum = sum(2*v+1, mid+1, tr, max(l, mid+1), r); return left_sum + right_sum; } sum(1, 0, size - 1, l, r);

Слайд 9





Let’s make the task more difficult
Запросы:
	1) Изменить значение элементов [l;r] на d
	2) Получить сумму на [l;r]
Для этого нам придётся воспользоваться методом «запаздывающего обновления».
Requests:
	1) Add the value d to every element on the segment [l;r]
	2) Get sum on the segment [l;r]
We use the method of “lazy propagation”
Описание слайда:
Let’s make the task more difficult Запросы: 1) Изменить значение элементов [l;r] на d 2) Получить сумму на [l;r] Для этого нам придётся воспользоваться методом «запаздывающего обновления». Requests: 1) Add the value d to every element on the segment [l;r] 2) Get sum on the segment [l;r] We use the method of “lazy propagation”

Слайд 10





struct Tree
struct Tree
{
	vector<int> t;
	vector<int> add     // array for method of “lazy propagation”
	int size;
	
	void init(vector<int> &a, int n){
		size = 1;
		while(size <= n) size *= 2;
		t.resize(2 * size, 0);
		add.resize(2 * size, 0);
		for (int i = 0; i < (int)a.size(); i++)
			t[i + size] = a[i];
		for (int i = size - 1; i > 0; i--)
			t[i] = t[2*i]+t[2*i+1];
	}
	
};
Описание слайда:
struct Tree struct Tree { vector<int> t; vector<int> add // array for method of “lazy propagation” int size; void init(vector<int> &a, int n){ size = 1; while(size <= n) size *= 2; t.resize(2 * size, 0); add.resize(2 * size, 0); for (int i = 0; i < (int)a.size(); i++) t[i + size] = a[i]; for (int i = size - 1; i > 0; i--) t[i] = t[2*i]+t[2*i+1]; } };

Слайд 11





The main function of the method
	void push(int v){
		add[2*v]+= add[v];
		add[2*v+1]+= add[v];
		add[v] = 0; 
	}
Описание слайда:
The main function of the method void push(int v){ add[2*v]+= add[v]; add[2*v+1]+= add[v]; add[v] = 0; }

Слайд 12





The change request
	void change(int v, int tl, int tr, int l, int r, int d){
		if (l > r) return;
		if (tl == l && tr == r){
			add[v] += d;
			return;
		}
		push(v);
		int mid = (tl + tr) / 2;
		change(2*v, tl, mid, l, min(r, mid), d);
		change(2*v+1, mid + 1, tr, max(l, mid + 1), r, d);
		t[v] = t[2*v] + (mid - tl + 1) * add[2*v] + t[2*v+1] + (r - mid) * add[2*v+1];
	}
	
	change(1, 0, size - 1, l, r, d);
Описание слайда:
The change request void change(int v, int tl, int tr, int l, int r, int d){ if (l > r) return; if (tl == l && tr == r){ add[v] += d; return; } push(v); int mid = (tl + tr) / 2; change(2*v, tl, mid, l, min(r, mid), d); change(2*v+1, mid + 1, tr, max(l, mid + 1), r, d); t[v] = t[2*v] + (mid - tl + 1) * add[2*v] + t[2*v+1] + (r - mid) * add[2*v+1]; } change(1, 0, size - 1, l, r, d);

Слайд 13





Getting sum
	int sum(int v, int tl, int tr, int l, int r){
		if (l > r) return 0;
		if (tl == l && tr == r){
			return t[v] + add[v] * (r - l + 1);;
		}
		push(v);
		int mid = (tl + tr) / 2;
		int left_sum = sum(2*v, tl, mid, l, min(r, mid));
		int right_sum = sum(2*v+1, mid+1, tr, max(l, mid+1), r);
		t[v] = t[2*v] + (mid - tl + 1) * add[2*v] + t[2*v+1] + (r - mid) * add[2*v+1];
		return left_sum + right_sum;
	}
	
	sum(1, 0, size - 1, l, r);
Описание слайда:
Getting sum int sum(int v, int tl, int tr, int l, int r){ if (l > r) return 0; if (tl == l && tr == r){ return t[v] + add[v] * (r - l + 1);; } push(v); int mid = (tl + tr) / 2; int left_sum = sum(2*v, tl, mid, l, min(r, mid)); int right_sum = sum(2*v+1, mid+1, tr, max(l, mid+1), r); t[v] = t[2*v] + (mid - tl + 1) * add[2*v] + t[2*v+1] + (r - mid) * add[2*v+1]; return left_sum + right_sum; } sum(1, 0, size - 1, l, r);

Слайд 14





Useful links
neerc.ifmo.ru:
Дерево отрезков. Построение
Реализация запроса в дереве отрезков сверху
Несогласованные поддеревья. Реализация массового обновления
E-maxx. Дерево отрезков – описано большое количество задач, которые решаются деревом отрезков с решением.
Codeforces (Eng article)
Описание слайда:
Useful links neerc.ifmo.ru: Дерево отрезков. Построение Реализация запроса в дереве отрезков сверху Несогласованные поддеревья. Реализация массового обновления E-maxx. Дерево отрезков – описано большое количество задач, которые решаются деревом отрезков с решением. Codeforces (Eng article)



Похожие презентации
Mypresentation.ru
Загрузить презентацию