洛谷U4859matrix[单调栈]
题目描述
给一个元素均为正整数的矩阵,上升矩阵的定义为矩阵中每行、每列都是严格递增的。
求给定矩阵中上升子矩阵的数量。
输入输出格式
输入格式:
第一行两个正整数n、m,表示矩阵的行数、列数。
接下来n行,每行m个正整数表示矩阵中的元素。
输出格式:
一个数表示数量。
输入输出样例
4 4
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
100
出题人的题解是O(n3)
感觉可以用单调栈做O(n2),果真可以
和仓鼠那道比较像
只是需要维护两个tot,一个是只考虑上下单增,另一个tot2同时考虑左右单增,合并时只能用tot2
如果tot>tot2还要给这个节点再加一个
//
// main.cpp
// luoguU4859
//
// Created by Candy on 10/10/16.
// Copyright © 2016 Candy. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x;
}
int n,m,a[N][N];// 0<a[i][j]
struct data{
int l,h;
}st[N];
int top=,tot[N],tot2[N];
ll ans=;
int main(int argc, const char * argv[]) {
n=read();m=read();
memset(a,-,sizeof(a));
for(int i=;i<=n;i++){
top=;
ll cnt=;
for(int j=;j<=m;j++){
a[i][j]=read();
if(a[i][j]<=a[i-][j]) tot[j]=tot2[j]=;
tot[j]++;tot2[j]++;
if(a[i][j]<=a[i][j-]){top=;cnt=;tot2[j]=;} data tmp;
tmp.h=tot2[j];
if(tot[j]==tot2[j]) tmp.l=;
else tmp.l=;
while(top&&st[top].h>=tmp.h){
tmp.l+=st[top].l;
cnt-=st[top].l*st[top].h;
top--;
}
st[++top]=tmp;
cnt+=tmp.l*tmp.h;
if(tot[j]>tot2[j]){
cnt+=*tot[j];
st[++top].h=tot[j];
st[top].l=;
}
ans+=cnt;
//printf("h %d %d %d %d\n",i,j,tot[j],tot2[j]);
//printf("i %d %d %d %d\ncnt %d\n",i,j,tmp.l,tmp.h,cnt);
}
//printf("ans %d\n",ans);
}
printf("%lld",ans);
return ;
}
洛谷U4859matrix[单调栈]的更多相关文章
- 洛谷P5788 单调栈(模板)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=3e6+10; 4 int n,a[N],s[N],ans[N ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- [NOIP2008] 提高组 洛谷P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 洛谷P1155 双栈排序
这题什么毒瘤......之前看一直没思路,然后心说写个暴搜看能有多少分,然后就A了??! 题意:给你一个n排列,求它们能不能通过双栈来完成排序.如果能输出最小字典序方案. [update]这里面加了一 ...
- 洛谷P1155 双栈排序(贪心)
题意 题目链接 Sol 首先不难想到一种贪心策略:能弹则弹,优先放A 然后xjb写了写发现只有\(40\),原因是存在需要决策的情况 比如 \(A = {10}\) \(B = {8}\) 现在进来一 ...
- 洛谷——P1155 双栈排序
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 洛谷 P1155 双栈排序
题面 解题思路 这道题乍一看还以为是个模拟..怒写一发30分(noip提高组t4有模拟吗?). 其实很好hack,如 10 10 2 8 1 7 9 3 4 5 6 按模拟的思路,应该是10入第一个栈 ...
- 洛谷$P1155$ 双栈排序 贪心+二分图匹配
正解:贪心+二分图匹配 解题报告: 传送门$QwQ$ 跪了,,,我本来以为我$NOIp$做得差不多了,,,然后康了一眼发现没做多少啊其实$QAQ$ 然后来康题趴$QwQ$ 首先考虑如果只有一个栈的情况 ...
- 洛谷P1155 双栈排序——思路题
题目:https://www.luogu.org/problemnew/show/P1155 思路... 看博客:https://www.cnblogs.com/Narh/p/9213825.html ...
随机推荐
- GA算法-R语言实现
旅行商问题 北工商-经研143班共有30位同学,来自22个地区,我们希望在假期来一次说走就走的旅行,将所有同学的家乡走一遍.算起来,路费是一笔很大的花销,所以希望设计一个旅行方案,确保这一趟走下来的总 ...
- HTML、CSS、JavaScript和PHP的注释
- 复杂的xml转化为java实体
一.样例一: 以根据订单号向支付宝查询支付是否成功为例(成功信息) 失败信息: <?xml version="1.0" encoding="utf-8"? ...
- 工厂方法(Factory Method),思考
最近看见一个关于如何通过工厂方法来重构代码的提问,发现这方面,自己还没有想得特别明白,所以,稍作总结. 只要有构造的地方,就有是用工厂方法的可能. 如果考虑到单元测试和实现的扩展,就有是用工厂方法的必 ...
- centos 更换软件源
最近都在使用国内的VPS.系统统一使用的都是Linux系统.但是,有一些服务商的系统给默认设置的是国外的.这样就会导致下载速度缓慢.于是,找到了国内几家比较热门的镜像点.奉献给大家.下面的镜像全部支持 ...
- JavaScript异步编程(2)- 先驱者:jsDeferred
JavaScript当前有众多实现异步编程的方式,最为耀眼的就是ECMAScript 6规范中的Promise对象,它来自于CommonJS小组的努力:Promise/A+规范. 研究javascri ...
- Android中的AlertDialog使用示例一(警告对话框)
在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,AlertDialog实现方法为建造者模式. ...
- iOS 实现转盘的效果
效果 #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBO ...
- AFNetWorking https请求 SSL认证 自制证书
1.服务器会给一个证书,一般为.pem格式证书 2.将.pem格式的证书转换成.cer格式的证书 打开电脑自带终端 ,进入到桌面 cd Desktop 回车回到桌面Desktop Admin$ 输入 ...
- js 调试
$(":select[name='start_Month'").each(function(item,i){ console.log(item.name + "" ...