题意在一个矩阵中,询问l~r行是否有一列满足mp[i][j]>=mp[i-1][j](i属于l~r)即非递减序列,是输出Yes,否输出No
用vector<vector<int> >储存矩阵mp
dp[i][j]表示在j列从i行往上推dp[i][j]行满足非递减,即在j列行i-dp[i][j]到行i满足非递减序列,同样用vector<vector<int> >储存
mx[i]表示在所有列中i-mx[i]最小的,即在所有列中在满足非递减的情况下从i行倒推的行数最多
所以但满足mx[r]>=r-l+1,证明至少有一列满足情况。
代码实现:
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #include<vector>
5 #include<algorithm>
6 using namespace std;
7 vector<vector<int> >mp;
8 vector<vector<int> >dp;
9 vector<int>mx;
10 int main()
11 {
12 int i,j,k,n,m,q,l,r;
13 while(~scanf("%d%d",&n,&m))
14 {
15 mp.resize(n+2);dp.resize(n+2);mx.resize(n+2);
16 for(i=0;i<n+2;i++)
17 {
18 mp[i].resize(m+2);
19 dp[i].resize(m+2);
20 }
21 for(i=1;i<=n;i++)
22 for(j=1;j<=m;j++)
23 {
24 scanf("%d",&mp[i][j]);
25 }
26 for(i=1;i<=n;i++)
27 mx[i]=0;
28 for(i=1;i<=m;i++)
29 dp[1][i]=1;
30 for(i=2;i<=n;i++)
31 for(j=1;j<=m;j++)
32 {
33 if(mp[i][j]>=mp[i-1][j])dp[i][j]=dp[i-1][j]+1;
34 else
35 dp[i][j]=1;
36 }
37 for(i=1;i<=n;i++)
38 for(j=1;j<=m;j++)
39 mx[i]=max(mx[i],dp[i][j]);//i-mx[i]~i是非递减的
40 scanf("%d",&q);
41 while(q--)
42 {
43 scanf("%d%d",&l,&r);
44 if(mx[r]>=r-l+1)printf("Yes
");
45 else
46 printf("No
");
47 }
48 }
49 return 0;
50 }