C

题目链接

题意在一个矩阵中,询问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 }
原文地址:https://www.cnblogs.com/WHLdbk/p/6441650.html