题意:
给出一个矩阵,询问是否有一列从l->r行的顺序是非递减的。
思路:
处理没一列,对于当前数字可以扩展到该列的哪一位,直到不满足非递减的条件,之后用一个矩阵存起来。
注意:
之后还需要处理当前行最大的扩展行。没写这步,竟然TLE100真是.
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
int res[100005];
typedef long long ll;
int main()
{
int n,m;
cin>>n>>m;
int a[n+5][m+5];
int mp[n+5][m+5];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&mp[i][j]);
}
}
for(int i=1;i<=m;i++)
{
int st=1;
int pos=0,flag,yes=0;
while(st<n)
{
flag=n,pos=st;
for(int j=st;j<n;j++)
{
if(mp[j+1][i] < mp[j][i] )
{
flag=j;
break;
}
}
for(int j=st;j<=flag;j++)
a[j][i]=flag;
st=flag+1;
}
}
for(int i=1;i<=m;i++)
a[n][i]=n;
int k;
//下面这步真的心酸,TLE100
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
res[i]=max(res[i],a[i][j]);
}
scanf("%d",&k);
while(k--)
{
int l,r;
scanf("%d%d",&l,&r);
int yes=0 ;
if(res[l]>=r)
yes=1;
if(yes)
printf("Yes\n");
else
printf("No\n");
}
}