CF1744F MEX vs MED 题解

CF1744F MEX vs MED 题解

题目传送门

题目大意

给定一个数列,求满足 mex(alar)>med(alar) 的区间 [l,r] 的个数。

解题思路

pii 出现的位置。

我们可以枚举 d,先确定 mex(alar)>d 的区间。由于数列是 0n1 的排列,所以这个区间必须包含 0d。用 l 记录区间最大左端点,r 记录区间最小左端点。可以在线维护 l,r,即 l=min{l,pd},r=max{r,pd}

接下来在考虑 med(alar)=d。由于这个区间已经包含了 0d,所以长度就是 2×d+22×d+1。知道长度后,就可以 O(1) 统计答案了。

时间复杂度为 O(n),可以通过本题。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
template <typename T> inline void read(T &x) {
    x = 0; char ch = getchar(); int f = 1;
    while (!isdigit(ch) && ch ^ '-') ch = getchar();
    if (ch == '-') f = -1, ch = getchar();
    while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar(); x *= f;
}
const int N = 1e7+5,mod = 41719;
int ans,n,a[N],l = N+1,r,p[N];
void work(int len)
{
	if(r-l+1>len) return;
	int _l = max(1ll,r-len+1),_r = min(l,n-len+1);
	ans+=max(0ll,_r-_l+1);
}
signed main()
{
	read(n);
	for(int i = 1;i<=n;i++)
		read(a[i]),p[a[i]] = i;
	for(int i = 0;i<n;i++)
	{
		l = min(l,p[i]),r = max(r,p[i]);
		int len = i*2+2;
		work(len),work(len-1);
	}
	cout<<((n+1)*n/2-ans)%mod;
	return 0;
}
posted @   pyy1  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示