给出一个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;
} 
京公网安备 11010502036488号