题意:
给出一个n*m<100000的矩阵,给出k个查询,每个查询给出l,r两个数字,问在l行与r行之间是否存在一列拥有非递减序。
题解:
用vector存每个位置的起始位置。
用数组存每行的起始位置的最小值。
查询复杂度O(1)。
#include<iostream>
#include<vector>
using namespace std;
const int INF=1e9+1;
int n,m,k;
vector<int> vec[101000];
vector<int> arr[101000];
int ori[101000];
int ans[101000];
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
int x;
cin>>x;
vec[i].push_back(x);
}
}
for(int i=0;i<m;i++) arr[0].push_back(0);
for(int i=1;i<n;i++){
for(int j=0;j<m;j++){
if(vec[i][j]>=vec[i-1][j]){
arr[i].push_back(ori[j]);
}
else{
ori[j]=i;
arr[i].push_back(i);
}
}
}
for(int i=0;i<n;i++) ans[i]=INF;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
ans[i]=min(ans[i],arr[i][j]);
}
}
cin>>k;
while(k--){
int a,b;
cin>>a>>b;
a--;b--;
if(ans[b]<=a) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}