有一定通用性的单调队列模板

  • 应用背景:
    我们对单调队列的需求是基本不变的,即基本功能上没有什么特殊的需求,主要改动都是在几个地方:队列中存储的下标格式(如数字,元组等)、每个下标对应的值、对值大小的比较、下标之前的距离(用于剔除超过范围的下标)
  • 解决方案:
    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++;
    }
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章