Минимум на неизменяемом отрезке O (N2+K)
Дан массив из N целых чисел и K запросов, состоящих из двух индексов.
Необходимо для каждого запроса вывести минимальный из элементов, расположенных между индексами в запросе.
Воспользуемся динамическим программированием. Пусть M[i][d] = минимальный из элементов массива с индексами от i до i + d включительно, тогда, очевидно, что M[i][0] = a[i] и M[i][d] = min (a[i + d], M[i][d - 1]).
Минимальное из чисел от i до j будет равно M[i][j - i].
Асимптотика O(N2+K).
Листинг C++
class table_min
{
private :
int n;
vector < int > a;
vector < vector < int > > M;
public :
table_min (vector < int > v)
{
int i, j;
a = v;
n = v.size ();
M.assign (n, vector < int > (n, (int)2e9));
for (i = 0; i < n; ++ i)
M[i][0] = a[i];
for (j = 1; j < n; ++ j)
for (i = 0; i + j < n; ++ i)
M[i][j] = :: min (M[i][j - 1], a[i + j]);
}
int min (int l, int r)
{
return M[l][r - l];
}
};
19:00
04.08.2009
По всем вопросам обращаться: rumterg@gmail.com