题意:给你n行m列的数组,和k次的询问,问从l行到r行是否存在一个非递增的列
思路:看到这道题的数据量我们就知道直接暴力不可取,所以我们采用了预处理的方法,我们记录下来每一行的最长的非递减的列的开头的哪个行,比如num[i]=k;表示到第i行的最长的非递减的列是从第k行开始的,在每一次的询问中我们只需要比较num[r]的值与l的值就可以了;
代码:
#include <cstdio> #include <cmath> #include <iostream> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int maxn=100005; int main() { int a[maxn],b[maxn],c[maxn]; int n,m; while(cin>>n>>m) { for(int i=1;i<=n;i++) { c[i]=i; for(int j=1;j<=m;j++) { int x; scanf("%d",&x); if(x<a[j]) b[j]=i; a[j]=x; if(c[i]>b[j]) c[i]=b[j]; } } int k; cin>>k; while(k--) { int r,l; scanf("%d %d",&l,&r); if(c[r]<=l) cout<<"Yes"<<endl; else cout<<"No"<<endl; } } return 0; }