全零子矩形计数问题
经典问题,但是我为什么不会呢?????
题意
给定一张
分析
考虑枚举每一行,计算以该行上每个点为右下角的合法子矩形个数
其实到这里已经可以思考单调栈了,但是为了捋顺思路,我们还是考虑对于每一行,只有该列上方的第一个 1 会对子矩形大小产生限制,而在某一个 1 往左的比该 1 所在行数要靠前的那些 1 也不会产生限制。据此我们考虑单调栈,预处理
时间复杂度
rep(j,1,m){
rep(i,1,n){
if(s[i][j]=='1')up[i][j]=0;
else up[i][j]=up[i-1][j]+1;
}
}
int ans=0;
rep(i,1,n){
tp=0;
sum[0]=0;
rep(j,1,m){
while(tp&&up[i][j]<=up[i][sta[tp]])--tp;
sum[j]=(sum[sta[tp]]+1ll*(j-sta[tp])*up[i][j]%mod)%mod;
ans=(ans+sum[j])%mod;
sta[++tp]=j;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现