- 应用背景:
我们对单调队列的需求是基本不变的,即基本功能上没有什么特殊的需求,主要改动都是在几个地方:队列中存储的下标格式(如数字,元组等)、每个下标对应的值、对值大小的比较、下标之前的距离(用于剔除超过范围的下标) - 解决方案:
1.对于不变的单调队列,写了一个struct Q,对于不同的需求不需要改动,可以重用
2.对于上述的几个需求,都可以对下边的Node结构进行定义来实现 - 补充:
可以一定程度上减少重复代码,而且并没有使用虚函数什么的,因为只是单纯的从减少代码量方面来考虑。以后如果有更好的方法,随时更新。
///Node用来表示一个下标,存放到单调队列中(需要修改)
struct Node {
int row, col;
Node(int row = 0, int col = 0) {
this->row = row;
this->col = col;
}
///返回下标对应的值(需要修改)
int getValue() {
return mat[row][col];
}
///x是否比y好,下标对应的值的比较(需要修改)
bool betterThan(Node& y) {
return getValue() > y.getValue();
}
///计算两个节点的下标距离,下标的比较(需要修改)
int getDistWith(Node& y) {
return abs(col - y.col);
}
};
template <typename T>
struct Q {
T index[maxn];
int l, r;
void init() {
l = 0;
r = -1;
}
void add(T idx) {
while (r >= l && idx.betterThan(index[r]))
r--;
index[++r] = idx;
}
T getFirst() {
if (l <= r)
return index[l];
else
return NULL;
}
void trim(int maxDiff) {
T maxIdx = index[r];
while (l <= r && maxIdx.getDistWith(index[l]) >= maxDiff)
l++;
}
};