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 ...
随机推荐
- linux查看 rsync 服务状态
[root@rsync-server-1 /]# lsof -i tcp:873 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsync ...
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) - B
题目链接:http://codeforces.com/contest/831/problem/B 题意:给第2个26个字母并不重复的字符串(2个字符串对于一个映射),第1个字符串为key集合,第2个字 ...
- 新特性2-lambda表达式
最近几天学习了一下lambda表达式,看了不少博客,感觉有一篇博客总结的一句话总结的很好:lambda表达式是一段可以传递的代码,它的核心思想是将面向对象中的传递数据变成传递行为.其实以前也有传递行为 ...
- 为什么需要bootloader
本文链接:https://blog.csdn.net/u012351051/article/details/50557899 受单片机和ARM7等小型CPU设备编程思维的影响,开始对嵌入式linux和 ...
- windows下laravel 快速安装
1. 安装composer https://getcomposer.org/ 2. 安装git windows 客户端工具 https://git-scm.com/downloads 3. 更改co ...
- Java中Comparable接口和Comparator接口的简单用法
对象比较器 1.Comparable接口 此接口强行对实现它的每个类的对象进行整体排序,这种排序成为类的自然排序,类的compareTo方法称为类的自然比较方法. 代码示例 import java.u ...
- 【leetcode】1033. Moving Stones Until Consecutive
题目如下: Three stones are on a number line at positions a, b, and c. Each turn, you pick up a stone at ...
- Spring Boot Shiro
Shiro 核心 API Subject:用户主体(每次请求都会创建Subject). principal:代表身份.可以是用户名.邮件.手机号码等等,用来标识一个登录主体的身份. credentia ...
- HashMap的几种遍历方式(转载)
今天讲解的主要是使用多种方式来实现遍历HashMap取出Key和value,首先在java中如果想让一个集合能够用for增强来实现迭代,那么此接口或类必须实现Iterable接口,那么Iterable ...
- socket函数库简单封装
#pragma once #ifndef WINSOCK_H #include<WinSock2.h> #pragma comment(lib,"ws2_32.lib" ...