題目:
思路:
我們考慮從上向下更新,引入兩個數組a{MAXN]:記錄上一行各列的數。b[MAXN]:記錄當前這一行的每一列能達到的最上面的符合條件(非嚴格單調遞增)的下標。那麼我們在討論第3行時,就不需要考慮第一列的數是多少了,我們的兩個數組已經把信息記錄下來了。我們在引入c[MAXN],記錄每一行能達到的最上面的符合條件(非嚴格單調遞增)的下標。
code:
#include<cstdio>
const int MAXN=1e5+5;
int a[MAXN],b[MAXN],c[MAXN];
int main(){
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
c[i]=i;//初始化假設第i行恰好是分界點。
for(int j=1;j<=m;++j){
int x;scanf("%d",&x);
if(x<a[j])b[j]=i;//如果這一行的某一個數x小於該行上一個數a[j],那麼這一行的這一列的數最大能達到的下標是i。換句話說b[j]記錄斷點。
a[j]=x;//更新,作爲下一行的上一行。
if(b[j]<c[i])c[i]=b[j];//c[i]爲該行能達到的最小的下標。
}
}
int k;scanf("%d",&k);
while(k--){
int l,r;scanf("%d%d",&l,&r);
if(c[r]<=l)printf("Yes\n");
else printf("No\n");
}
}