Тема: дерево отрезков
как можно с помощью дерева отрезков делать update(l,r,x) за O(logN)?
update(l, r, x) = обновить все элементы с l до r на x
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
MAXimal :: φορυμ » Algo » дерево отрезков
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
как можно с помощью дерева отрезков делать update(l,r,x) за O(logN)?
update(l, r, x) = обновить все элементы с l до r на x
Обновить - в плане увеличить или сделать равными икс?
Если увеличить, то для каждого отрезка нужно помимо минимума хранить еще на сколько мы все числа из отрезка увеличивали. Обновление будет выглядеть примерно так:
void update(int l,int r,int a,int b,int val,int num)
{
if (l==a && b==r-1)
{
mod[num]+=val;
return;
}
int xx=(r+l)/2;
if (b<xx) update(l,xx,a,b,val,num*2); else
if (a>=xx) update(xx,r,a,b,val,num*2+1); else
{
update(l,xx,a,xx-1,val,num*2);
update(xx,r,xx,b,val,num*2+1);
}
mn[num]=min(mn[num*2]+mod[num*2],mn[num*2+1]+mod[num*2+1]);
}
Поиск минимума так:
ll fnd(int l,int r,int a,int b,int num)
{
if (l==a && b==r-1) return mn[num]+mod[num];
int xx=(r+l)/2;
if (b<xx) return fnd(l,xx,a,b,num*2)+mod[num]; else
if (a>=xx) return fnd(xx,r,a,b,num*2+1)+mod[num]; else
return min(fnd(l,xx,a,xx-1,num*2),fnd(xx,r,xx,b,num*2+1))+mod[num];
}
Если же имелось ввиду установить равными иксу, то нужно хранить, одинаковые ли значения на данном отрезке и если одинаковые то чему они равны. При запросе просто проталкивать эту информацию к потомкам.
Вопрос снова приобрел актуальность. Возможна ли модификация на прямоугольнике за O(logN*logN) и дополнительной памяти O(N*N)?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
MAXimal :: φορυμ » Algo » дерево отрезков