51nod 1215 数组的宽度

Posted 友人A

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1215 数组的宽度相关的知识,希望对你有一定的参考价值。

N个整数组成的数组,定义子数组a[i]..a[j]的宽度为:max(a[i]..a[j]) - min(a[i]..a[j]),求所有子数组的宽度和。
 
Input
第1行:1个数N,表示数组的长度。(1 <= N <= 50000)
第2 - N + 1行:每行1个数,表示数组中的元素(1 <= A[i] <= 50000)
Output
输出所有子数组的宽度和。
Input示例
5
1
2
3
4
5
Output示例
20
————————————————————————————
这题单独考虑mx的和 和 mn的和
开两个单调栈就可以了23333
技术分享
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=50007,inf=0x3f3f3f3f;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<0||c>9){if(c==-) f=-1; c=getchar();}
    while(c>=0&&c<=9){ans=ans*10+(c-0); c=getchar();}
    return ans*f;
}
int n,w1[M],w2[M];
int sk1[M],tp1,sk2[M],tp2;
LL mx,mn;
int main()
{
    n=read();
    for(int i=1;i<=n;i++) w1[i]=w2[i]=read();
    n++; w1[n]=inf; w2[n]=-1;
    for(int i=1;i<=n;i++){
    while(tp1&&w1[i]>=w1[sk1[tp1]]) mx+=1LL*w1[sk1[tp1]]*(i-sk1[tp1])*(sk1[tp1]-sk1[tp1-1]),tp1--;
        while(tp2&&w2[i]<=w2[sk2[tp2]]) mn+=1LL*w2[sk2[tp2]]*(i-sk2[tp2])*(sk2[tp2]-sk2[tp2-1]),tp2--;
        sk1[++tp1]=sk2[++tp2]=i;
    }
    printf("%lld\n",mx-mn);
    return 0;
}
View Code

 

 




以上是关于51nod 1215 数组的宽度的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1215 单调栈/迭代

51nod 1215 数组的宽度&poj 2796 Feel Good(单调栈)

51Nod - 1102 面积最大的矩形

51nod1279(二分)

1215 数组的宽度

51 nod 1279 扔盘子