Imbalanced Array
题目描述
对于给定由 n 个元素构成的数组。一个子数组的不平衡值是这个区间的最大值与最小值的差值。数组的不平衡值是它所有子数组的不平衡值的总和。
以下是数组[1,4,1]不平衡值为9的例子,共有6个子序列:
[1] (从第一号到第一号)不平衡值为 0;
[1, 4] (从第一号到第二号), 不平衡值为 3;
[1, 4, 1] (从第一号到第三号),不平衡值为 3;
[4] (从第二号到第二号),不平衡值为 0;
[4, 1] (从第二号到第三号),不平衡值为 3;
[1] (从第三号到第三号)不平衡值为 0;
输入样例
3
1 4 1
输出样例
9
思路
刚看到这道题时,因为是紫题,慌得一批,结果仔细一看,是道假紫题。
用四个单调栈,再统计一下就行了
代码
#pragma once
#pragma GCC diagnostic error "-std=c++11"
#pragma GCC target("avx")
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")//50行头文件加速,燃烧你的卡路里
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<queue>
#include<deque>
#define int long long
using namespace std;
int l[1000101],r[1000101],l2[1000101],r2[1000101],a[1000101],n,ans,y[1000101],t=1;
signed main()
{
cin>>n;
y[t]=0;
a[n+1]=a[0]=0x7ffffff;
for(int i=1;i<=n;i++)
{
cin>>a[i];
while(a[i]>=a[y[t]])
t--;
l[i]=y[t];
y[++t]=i;
}//第一个单调栈
t=1,y[t]=n+1;
for(int i=n;i>=1;i--)
{
while (t>0&&a[i]>a[y[t]])
t--;
r[i]=y[t];
y[++t]=i;
}//第二个单调栈
a[n+1]=-0x7ffffff;
a[0]=-0x7ffffff;
t=1;
y[t]=n+1;
for(int i=n;i>=1;i--)
{
while(a[i]<=a[y[t]])
t--;
r2[i]=y[t];
y[++t]=i;
}//第三个单调栈
t=1;
y[t]=0;
for(int i=1;i<=n;i++)
{
while(t>0&&a[i]<a[y[t]])
t--;
l2[i]=y[t];
y[++t]=i;//第四个单调栈
ans=ans+a[i]*(i-l[i])*(r[i]-i);
ans=ans-a[i]*(i-l2[i])*(r2[i]-i);//统计
}
cout<<ans;//输出结果
return 0;
}
该博客详细介绍了洛谷上的一道题目CF817D - Imbalanced Array,讨论了如何利用单调栈解决数组不平衡值的问题。博主指出这是一道看似难度较高的紫题,但实际上可以通过简单的思路和四个单调栈进行求解。博客内容包括题目描述、输入输出样例、解题思路和代码实现。
485

被折叠的 条评论
为什么被折叠?



