给出一个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; }