ABC 247 | E - Max Min
题目描述
给定一个长度为的序列和两个数,求满足以下条件的的个数。
- 的最大值为,最小值为
数据范围
解题思路
该题为计数题,可以在的时间复杂度内被暴力解决,由于数据范围为,考虑对算法进行优化。
观察到题目的给出的条件发现:符合条件的序列中不会包含大于和小于的数,故考虑以这些数为分界线划分数组,然后对其中的每一个子段求符合条件的序列个数。
这些子段中的满足,故寻找最大值为且最小值为的序列等价于寻找包含且包含的序列,符合条件的序列可以通过双指针算法在复杂度内求得,为该段序列长度。故对于整个数组长度为的序列,时间复杂度为。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
int n, x, y;
int a[N];
ll calc(int st, int ed){
ll ans = 0, cntx = 0, cnty = 0;
for(int l = st, r = st; l < ed; l ++){
while(!(cntx && cnty) && r < ed){
if(a[r] == x) cntx ++;
if(a[r] == y) cnty ++;
r ++;
}
if(cntx && cnty) ans += (ed - r + 1);
if(a[l] == x) cntx --;
if(a[l] == y) cnty --;
}
return ans;
}
int main()
{
scanf("%d%d%d", &n, &x, &y);
for(int i = 0; i < n; i ++) scanf("%d", &a[i]);
ll ans = 0;
for(int i = 0; i < n; ){
int l = i;
while(i < n && a[i] <= x && a[i] >= y) i ++;
if(i > l) ans += calc(l, i);
i ++;
}
printf("%lld\n", ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架