E - Max Min AtCoder Beginner Contest 247

max min

We have a number sequence A=(A1,A2,,AN) of length N and integers X and Y. Find the number of pairs of integers (L,R) satisfying all the conditions below.

给定数列A=(A1,A2,,AN),求有多少数对 (L,R) 满足以下条件

  • 1LRN
  • The maximum value of AL,AL+1,,AR is X, and the minimum is Y.(AL,AL+1,,AR中最大的是X,最小的是Y。)

Constraints

1N2×105

1Ai2×105

1YX2×105

All values in input are integers.

输入

N X Y A1 A2 …… AN

输出

输出答案

题目解析

容斥原理

假设函数f(x,y)为所有值都在(x,y)之内的区间的对数,那么我们可以通过容斥原理,得到上限为Y,下界为X的答案数量。

由于(x,y)是个很大的范围,势必包括了不以Y为最大值,不以X为最小值的区间,因此我们需要减去这些区间。

显而易见,区间(x+1,y)的下限一定不是X,区间(x,y1)的上限是y1,一定不是Y,所有需要减去这两个区间。

值得注意的是,减去这两个区间后,又多剪了一个区间(x+1,y1),最终需要再加上,因此,最后的答案为:

ans=f(x,y)f(x+1,y)f(x,y1)+f(x+1,y1)

函数f

我们可以选用双指针去得到在(x,y)之间的所有数量,右指针r一直向后移动,直到遇到某数字在(x,y)之外,这时左指针再放到右指针后面。

每次移动右指针,其答案数量都可以看作以r为右边界,从lr的任意一个数字为左边界,答案变化为rl+1

AC CODE

#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5+7; ll a[N]; int n; ll work(ll y, ll x) { ll ans = 0; for(int i = 1, j = 1 ; i <= n ; i++) { if(a[i] < y || a[i] > x) j = i+1; ans += i-j+1; } return ans; } int main() { int x,y; cin >> n; cin >> x >> y; for(int i = 1 ; i <= n ; i++) scanf("%lld",&a[i]); ll all = work(y,x),t1 = work(y+1,x),t2 = work(y,x-1), t3 = work(y+1,x-1); cout << all-t1-t2+t3; }

__EOF__

本文作者seekerzhz
本文链接https://www.cnblogs.com/zhaohanzheng/p/16483680.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   seekerHeron  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示