给出一个n*m<100000的矩阵,给出k个查询,每个查询给出l,r两个数字,问在l行与r行之间是否存在一列连续非递减序。

题解:vector保存每个数,然后对每一列中的所有连续非递减的区间插入到set中。

然后对每个查询,判断查询区间是否被包含在set里面

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
vector<int> a[maxn];
struct node {
    int l, r;
    bool operator < (node t) const {
        if (l != t.l) return l < t.l;
        return r > t.r;
    }
};
set<node> st;
set<node> ans;

int main() {
    int n, m, x;
    cin >> n >> m;
    for (int i = 1; i <= m; i++) a[i].push_back(0);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> x;
            a[j].push_back(x);
        }
    } 
    for (int i = 1; i <= m; i++) {
        int l = 1, r = 0;
        for (int j = 1; j <= n; j++) {
            if (a[i][j]  < a[i][j - 1]) {
                node t; t.l = l; t.r = r;
                st.insert(t); 
                l = j; r = j;
            } else {
                r++;
            }
        }
        node t; t.l = l; t.r = r;
        st.insert(t);
    }
//    cout <<endl;;
    int l,r = -1e9;
    for (set<node>::iterator iter = st.begin(); iter != st.end(); iter++) {
        node t = *iter;
//        cout << t.l << " " << t.r << endl;
        if (r < t.r) {
            ans.insert(t); 
            r = t.r;
        }
    }
//    cout <<endl;
    for (set<node>::iterator iter = ans.begin(); iter != ans.end(); iter++) {
        node t = *iter;
//        cout << t.l << " " << t.r <<endl;
    }
//    cout << endl;
    int q;
    cin >> q;
    while (q--) {
        cin >> l >> r;
        node t; t.l = l; t.r = r;
        set<node>::iterator iter = ans.lower_bound(t);
        if (iter == ans.end()) {
            iter--;
            if ((*iter).r < t.r) {
                cout << "No" << endl;
            } else {
                cout << "Yes" << endl;
            }

        } else if (iter == ans.begin()) {
            if ((*iter).l != t.l) {
                cout << "No" << endl;
            } else if((*iter).r < t.r) {
                cout << "No" << endl;
            } else {
                cout << "Yes" << endl;
            }
        } else if ((*iter).l == t.l) {
            if ((*iter).r < t.r){
                cout << "No" << endl;
            } else {
                cout << "Yes" <<endl;
            }
        } else {
            iter--;
            if((*iter).r < t.r) {
                cout<< "No" << endl;
            } else {
                cout << "Yes" << endl;
            }
        }
    }
    return 0;
}