2019牛客暑期多校训练营(第一场) - A - Equivalent Prefixes - 单调栈
A - Equivalent Prefixes - 单调栈
题意:给定两个n个元素的数组a,b,它们的前p个元素构成的数组是“等价”的,求p的最大值。“等价”的意思是在其任意一个子区间内的最小值相同。
考虑使用单调栈去弄它。每次单调栈中的元素会回答以栈顶元素为结尾的区间的最小值是多少。
比如数组:
2,4,3,5,1
前1个元素的单调栈:
{{2,1}}
意思是[1,1]的最小值是2
前2个元素的单调栈:
{{2,1},{4,2}}
意思是[1,2]的最小值是2,[2,2]的最小值是4
前3个元素的单调栈:
{{2,1},{3,3}}
意思是[1,3]的最小值是2,[2,3]的最小值是3,[3,3]的最小值是3
前4个元素的单调栈:
{{2,1},{3,3},{5,4}}
意思是[1,4]的最小值是2,[2,4]的最小值是3,[3,4]的最小值是3,[4,4]的最小值是5
前5个元素的单调栈:
{{5,1}}
意思是[x,5]的最小值都是1
所以每次只需要比较单调栈的大小就可以知道是不是新加的元素可以使得数组保持“等价”。
要是使用单调队列,那么在新元素入队之前弹空,弹出的时候可以顺便把一系列的区间最值给刷新掉。
#include<bits/stdc++.h>
using namespace std;
int a[500005];
int b[500005];
stack<int> sta, stb;
int main() {
int n;
while(~scanf("%d", &n)) {
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for(int i = 1; i <= n; i++) {
scanf("%d", &b[i]);
}
int ans = 0;
for(int i = 1; i <= n; i++) {
while(!sta.empty() && sta.top() >= a[i])
sta.pop();
sta.push(a[i]);
while(!stb.empty() && stb.top() >= b[i])
stb.pop();
stb.push(b[i]);
if(sta.size() != stb.size())
break;
else
ans++;
}
printf("%d\n", ans);
while(!sta.empty())
sta.pop();
while(!stb.empty())
stb.pop();
}
}
不用STL会更省内存,但不一定会更快。其实这个算法是在线的,a和b可以不存。
#include<bits/stdc++.h>
using namespace std;
int a[500005];
int b[500005];
int sta[500005], statop;
int stb[500005], stbtop;
int main() {
int n;
while(~scanf("%d", &n)) {
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int i = 1; i <= n; i++)
scanf("%d", &b[i]);
int ans = 0;
statop = 0, stbtop = 0;
for(int i = 1; i <= n; i++) {
while(statop && sta[statop] >= a[i])
statop--;
sta[++statop] = a[i];
while(stbtop && stb[stbtop] >= b[i])
stbtop--;
stb[++stbtop] = b[i];
if(statop != stbtop)
break;
else
ans++;
}
printf("%d\n", ans);
}
}
2019牛客暑期多校训练营(第一场) - A - Equivalent Prefixes - 单调栈的更多相关文章
- 2019 牛客暑期多校 第八场 A All-one Matrices (单调栈+前缀和)
题目:https://ac.nowcoder.com/acm/contest/888/A 题意:找全1矩阵的个数,并且这个全1矩阵不被其他全1矩阵包含 思路:这里引用付队说的话 -> { 这类问 ...
- 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)
题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...
- 2019牛客暑期多校训练营(第九场) D Knapsack Cryptosystem
题目 题意: 给你n(最大36)个数,让你从这n个数里面找出来一些数,使这些数的和等于s(题目输入),用到的数输出1,没有用到的数输出0 例如:3 4 2 3 4 输出:0 0 1 题解: 认真想一 ...
- 2019 牛客暑期多校 第三场 F Planting Trees (单调队列+尺取)
题目:https://ac.nowcoder.com/acm/contest/883/F 题意:求一个矩阵最大面积,这个矩阵的要求是矩阵内最小值与最大值差值<=m 思路:首先我们仔细观察范围,我 ...
- 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)
layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...
- 牛客多校第一场 A Equivalent Prefixes 单调栈(笛卡尔树)
Equivalent Prefixes 单调栈(笛卡尔树) 题意: 给出两个数组u,v,每个数组都有n个不同的元素,RMQ(u,l,r)表示u数组中[l,r]区间里面的最小值标号是多少,求一个最大的m ...
- 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
- 2019牛客暑期多校训练营(第一场)-A (单调栈)
题目链接:https://ac.nowcoder.com/acm/contest/881/A 题意:给定两个长度均为n的数组a和b,求最大的p使得(a1,ap)和(b1,bp)等价,等价的定义为其任意 ...
- 2019牛客暑期多校训练营(第一场) B Integration (数学)
链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...
随机推荐
- 【错误】mysql 出现 "1067 - Invalid default value for 'UPDATE_TIME' " 错误提示的解决办法
今天工作中遇到修改表结构的时候出现错误 Invalid default value for 'UPDATE_TIME 问题原因是因为db 表中update_time的默认时间写成了 '0000-00- ...
- 2019-8-31-dotnet-core-集成到-Mattermost-聊天工具
title author date CreateTime categories dotnet core 集成到 Mattermost 聊天工具 lindexi 2019-08-31 16:55:58 ...
- C++宽字符串转字符串
这文章是更改别人代码 #include <string> #include <iostream> #include <stdlib.h> #include < ...
- tf.concat,连接矩阵
tf.concat(concat_dim, values, name='concat') concat_dim需要连接的矩阵的维度, values需要连接的两个矩阵. a=[[1,2,3],[7,8, ...
- Oracle11gR2 64bit+Oracle11gR2Client32bit+pl/sql 9
安装Oracle数据库,费了老一番折腾准备软件:1. Oracle 11g R2 64bit2. Oracle 11g R2 Client 32bit3. PLSQL Developer V9 逐个安 ...
- nginx多层反代配置变量proxy_set_header
Nginx多层反代配置变量proxy_set_header过程记录 第一层代理: (1)路径: $ vim /data/soft/nginx/conf/vhost/xixi.conf (2)内容:(注 ...
- zabbix 4.2 安装教程
1.我这里使用的是ali的yum源 #wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7 ...
- SQL中exists和in的区别
- Linux Crontab命令定时任务基本语法
一.Crontab查看编辑重启 1.查看crontab定时执行任务列表 crontab -l 2.编辑crontab定时执行任务 crontab -e 3.删除crontab定时任务 crontab ...
- 刷leetcode之路
写的不是很好,仅记录自己所写的,仅供参考. 第七题: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = ...