最大值
void get_max(int a[], int b[], int tot, int k)
{
int hh = 0, tt = -1;
for (int i = 0; i < tot; i ++ )
{
if (hh <= tt && q[hh] <= i - k) hh ++ ; //如果队列不为空且已经有k个元素hh++
while (hh <= tt && a[q[tt]] <= a[i]) tt -- ;//如果上一元素小于当前元素,且队列不为空tt--,直到tt==hh-1l
q[ ++ tt] = i;
b[i] = a[q[hh]]; //更新k段内当前元素最大值
}
}
最小值
void get_min(int a[], int b[], int tot, int k)
{
int hh = 0, tt = -1;
for (int i = 0; i < tot; i ++ )
{
if (hh <= tt && q[hh] <= i - k) hh ++ ;
while (hh <= tt && a[q[tt]] >= a[i]) tt -- ;
q[ ++ tt] = i;
b[i] = a[q[hh]];
}
}