奶牛排队【题解】
题目描述#
奶牛在熊大妈的带领下排成了一条直队。
显然,不同的奶牛身高不一定相同……
现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛
从左到右给出奶牛的身高,请告诉它们符合条件的最多的奶牛数(答案可能是
输入格式#
第一行一个正整数
接下来
输出格式#
一行一个整数,表示最多奶牛数。
样例 #1#
样例输入 #1#
5
1
2
3
4
1
样例输出 #1#
4
提示#
样例解释#
取第
数据范围#
对于全部的数据,满足
浅浅谈一下
.1#
记一个右端点
为区间最大值,则 必须要大于 的上一个后缀最大值 为区间最小值,那么 为这个前缀的最小值
记
二分即可
#
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 7;
int n, ans;
ll a[MAXN];
vector<int> maxx, minn;//后缀最小值和后缀最大值
int main () {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
generate (a + 1, a + 1 + n, [](){ll x; cin >> x; return x;});
maxx.push_back(0), minn.push_back(0);
for (int r = 1; r <= n; r ++) {//枚举右端点
while (!maxx.empty() && a[maxx.back()] <= a[r] && maxx.back() != 0) maxx.pop_back();
while (!minn.empty() && a[minn.back()] >= a[r]) minn.pop_back();
int l = upper_bound(minn.begin(), minn.end(), maxx.back()) - minn.begin();
//不存在返回a.end()
if (l != minn.end() - minn.begin()) ans = max (ans, r - minn[l] + 1);
maxx.push_back(r), minn.push_back(r);
}
cout << ans << endl;
return 0;
}
#
设我们正在处理
我们取最大值,如果有多个最大值取最后的,记作
我们取最小值,如果有多个最小值取最左的,记作
分类讨论
- 若
则 肯定是合法区间,但是左边和右边也有可能有,递归处理 和 - 若
则不可能有合法区间跳过 ,于是我们递归处理 和 和 即可
代码:
你在想什么?
完结撒花✿✿ヽ(°▽°)ノ✿
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!