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 }
阅读全文
0 0
- c
- c
- c
- c
- C
- c
- c
- c
- C+
- c
- C
- c
- c
- c
- C
- C
- c
- C
- 22种代码味道(Martin Fowler与Kent Beck)
- linux 安装 svn
- 限制textarea字数
- Servlet常见注意事项
- Docker镜像与容器存储结构分析
- C
- linux + apache + svn
- yum 安装 webmin
- Android视图框架Activity,Window,View,ViewRootImpl理解
- 转的SQL备份
- 错排问题 组合数学+容斥原理
- jQuery向动态添加的组件绑定事件
- 用PersonalRank实现基于图的推荐算法
- MyEclipse 8.6 安装 SVN 并优化(转的)