C

来源:互联网 发布:ubuntu 无故断网 编辑:程序博客网 时间:2024/06/06 01:54

题目链接

题意在一个矩阵中,询问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             else35             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\n");45             else46             printf("No\n");47         }48     }49     return 0;50 }