MAXimal
home
algo
bookz
forum
about
������ �������
Page source on the
HTML
language:
<h1>������ �������</h1> <p><b>������ �������</b> - ��� ��������� ������, ������ �� �������, ���������� ���������� ����������:</p> <p>1) ��������� ��������� �������� ��������� ��������� �������� G �� ����� ������� [L; R] �� ����� <b>O (log N)</b>;</p> <p>2) ��������� �������� �������� ������ �������� �� <b>O (log N)</b>;</p> <p>3) ������� <b>O (N) ������</b>, � ������, ����� ������� ��, ������� � ������ �� N ���������;</p> <p>4) ����� ���������� �� ������ ����������� ��������.</p> <p>�������� ���������������� ���������� ������ ������� - ��� ���������� ����� �� �������, �.�. ������� G (X1, ..., Xk) = X1 + ... + Xk.</p> <p>������ ������� ���� ������� ������� � ������ "A new data structure for cumulative frequency tables" (Peter M. Fenwick, 1994).</p> <h2>��������</h2> <p>��� �������� �������� �� ������������, ��� �������� G, �� ������� �� ������ ������, - ��� <b>�����</b>.</p> <p>����� ��� ������ A[0..N-1]. ������ ������� - ������ <b>T</b>[0..N-1], � ������ �������� �������� �������� ����� ��������� ��������� ������� A:</p> <formula><b>T<sub>i</sub> = ����� A<sub>j</sub></b> ��� ���� <b>F(i) <= j <= i</b>,</formula> <p>��� F(i) - ��������� �������, ������� �� ��������� ��������� �����.</p> <p>������ �� ��� ����� �������� <b>���������</b> ��� ������� ���������� ����� �� ������� [0; R] � ��� ������� ��������� ������:</p> <code>int sum (int r) { int result = 0; while (r >= 0) { result += t[r]; r = f(r) - 1; } return result; } void inc (int i, int delta) { ��� ���� j, ��� ������� F(j) <= i <= j { t[j] += delta; } }</code> <p>������� sum �������� ��������� �������. ������ ���� ����� ���� �� ���� ��������� ������� A, ��� �������� �� ������� T, ����� "������" ����� ������� ���, ��� ��� ��������. ������� ��� ���������� � ������ �������� ����� �� ������� [F(R); R], ����� ���� ����� �� ������� [F(F(R)-1); F(R)-1], � ��� �����, ���� �� ����� �� ����.</p> <p>������� inc �������� � �������� ������� - � ������� ���������� ��������, �������� �������� ����� T<sub>j</sub> ������ ��� ��� �������, ��� ������� ��� �����, �.�. ��� ���� j, ��� ������� F(j) <= i <= j.</p> <p>��������, ��� �� ������ ������� F ����� �������� �������� ���������� ����� ��������. ������ �� ���������� �������, ������� �������� ������� ��������������� ������������������ � ����� �������.</p> <p><b>��������� �������� F(X)</b> ��������� �������. ���������� �������� ������ ����� ����� � ��������� �� ��� ������� ���. ���� �� ����� ����, �� F(X) = X. ����� �������� ������������� ����� X ������������ �� ������ �� ����� ��� ���������� ������. ������� ��� ������� �� ���� ������ �� ����, � �������� ���������� ����� �������� ������� F(X).</p> <p>����� �������� �������� �������� ������������� ����� ������� �������:</p> <formula><b>F(X) = X & (X+1)</b>,</formula> <p>��� & - ��� �������� ���������� ����������� "�".</p> <p>�������� ���������, ��� ��� ������� ������������� ���������� �������� �������, ������� ����.</p> <p> </p> <p>��� �������� ������ ��������� ������ �������� ����� ����� j, ��� ������� F(j) <= i <= j.</p> <p>������ �������� ��������� � ���, ��� ��� ����� ����� j ���������� �� i ����������������� �������� ������ ������� (������ ��������) ���� � �������� �������������. ��������, ��� i = 10 �� �������, ��� j = 11, 15, 31, 63 � �.�.</p> <p>��� �� �������, ����� �������� (������ ������ �������� ���� �� �������) ����� ������������� ����� ������� �������:</p> <formula><b>H(X) = X | (X+1)</b>,</formula> <p>��� | - ��� �������� ���������� ����������� "���".</p> <h2>���������� ������ ������� ��� ����� ��� ����������� ������</h2> <code>vector<int> t; int n; void init (int nn) { n = nn; t.assign (n, 0); } int sum (int r) { int result = 0; for (; r >= 0; r = (r & (r+1)) - 1) result += t[r]; return result; } void inc (int i, int delta) { for (; i < n; i = (i | (i+1))) t[i] += delta; } int sum (int l, int r) { return sum (r) - sum (l-1); } void init (vector<int> a) { init ((int) a.size()); for (unsigned i = 0; i < a.size(); i++) inc (i, a[i]); }</code> <h2>���������� ������ ������� ��� �������� ��� ����������� ������</h2> <p>������� ����� ��������, ���, ��������� ������ ������� ��������� ����� �������� ������� � ������������ ������� [0;R], �� �� ����� �� ������ ����� ������� �� ������� [L;R], ��� L > 0. �����, ��� ��������� �������� ������ ����������� ������ � ������� ���������� (����� ��, ��������� ����� �� ��������� �������� ������� min). ��� ������������ �����������.</p> <code>vector<int> t; int n; const int INF = 1000*1000*1000; void init (int nn) { n = nn; t.assign (n, INF); } int getmin (int r) { int result = INF; for (; r >= 0; r = (r & (r+1)) - 1) result = min (result, t[r]); return result; } void update (int i, int new_val) { for (; i < n; i = (i | (i+1))) t[i] = min (t[i], new_val); } void init (vector<int> a) { init ((int) a.size()); for (unsigned i = 0; i < a.size(); i++) update (i, a[i]); }</code> <h2>���������� ������ ������� ��� ����� ��� ���������� ������</h2> <p>��� ��� ����������, ������ ������� ����� ���������� �� ����������� ������.</p> <code>vector <vector <int> > t; int n, m; int sum (int x, int y) { int result = 0; for (int i = x; i >= 0; i = (i & (i+1)) - 1) for (int j = y; j >= 0; j = (j & (j+1)) - 1) result += t[i][j]; return result; } void inc (int x, int y, int delta) { for (int i = x; i < n; i = (i | (i+1))) for (int j = y; j < m; j = (j | (j+1))) t[i][j] += delta; }</code>