Codeforces 777C - Alyona and Spreadsheet - [DP]
题目链接:http://codeforces.com/problemset/problem/777/C
题意:
给定 n×m 的一个数字表格,给定 k 次查询,要你回答是否存在某一列 j,其对应于询问区间 [l,r] 的 a[l][j],a[l+1][j],⋯,a[r][j] 这个序列,是否为非递减的。
题解:
考虑 f[i][j] 表示只考虑第 j 列的情况下,以 a[i][j] 为末尾的单调不减序列的最长长度,这个很容易求出来。
那么,我们对于某一行 i,已经可以知道 f[i][1],f[i][2],⋯,f[i][m] 这些值了,求出它们的最大值 mx[i],这个值即对应一个查询 [l,r],在确定下端为 r 的情况下,其上端最长可以延伸多远。
时间复杂度为 O(nm+k)。
AC代码:
#include<bits/stdc++.h> using namespace std; const int SIZE=1e5+5; int n,m,q; int a[SIZE],f[SIZE],mx[SIZE]; inline idx(int x,int y){return x*m+y;} inline x(int idx){return idx/m;} inline y(int idx){return idx%m;} int main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin>>n>>m; for(int i=0;i<n;i++) { mx[i]=1; for(int j=0;j<m;j++) { cin>>a[idx(i,j)]; if(i==0 || a[idx(i-1,j)]>a[idx(i,j)]) f[idx(i,j)]=1; else f[idx(i,j)]=f[idx(i-1,j)]+1; mx[i]=max(mx[i],f[idx(i,j)]); } } cin>>q; int l,r; while(q--) { cin>>l>>r; l--,r--; if(mx[r]>=r-l+1) cout<<"Yes\n"; else cout<<"No\n"; } }
转载请注明出处:https://dilthey.cnblogs.com/
分类:
04.动态规划
标签:
codeforces
, dp
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 手把手教你更优雅的享受 DeepSeek
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现