TOJ4244: Sum

Posted ww123

tags:

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

描述

Given a sequence, we define the seqence‘s value equals the difference between the largest element and the smallest element in the sequence. As an example, the value of sequence (3, 1, 7, 2) = 7-1 = 6.

Now, given a sequence S, output the sum of all value of consecutive subsequences.

输入

The first line has an integer N (2 ≤ N ≤ 300000) indicating the number of elements of the sequence. Then follows N lines, each line has a positive integer no larger than 10indicating an element of the sequence.

输出

Output the requested sum.

样例输入

4
3
1
7
2

 

样例输出

31

解题思路: 化简公式可得求的是所有区间最大值的和-所有区间最小值的和 。维护单调找,计算每个元素的贡献。

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=3e5+5;
LL a[N],st[N];
int main()
{
    int n,m,k;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];    
    LL ans=0,sum=0,top=0;    
    for(int i=1;i<=n;i++){
        while(top>0&&a[i]>a[st[top]]){
            LL num=a[st[top]];
            sum-=num*(st[top]-st[top-1]);
            top--; 
        }
        st[++top]=i;
        sum+=a[i]*(st[top]-st[top-1]);
        ans+=sum;
    }//区间最大值和 
    sum=0,top=0;
    for(int i=1;i<=n;i++){
        while(top>0&&a[i]<a[st[top]]){
            LL num=a[st[top]];
            sum-=num*(st[top]-st[top-1]);
            top--;
        }
        st[++top]=i;
        sum+=a[i]*(st[top]-st[top-1]);
        ans-=sum; 
    }//区间最小值和 
    cout<<ans<<endl;
} 

 

以上是关于TOJ4244: Sum的主要内容,如果未能解决你的问题,请参考以下文章

TOJ2780: 数数小木块

1 代码片段1

AC日记——平衡树练习 codevs 4244

TOJ 2560 Geometric Shapes(鍒ゆ柇澶氳竟褰㈡槸鍚︾浉浜?

bzoj 4244 括号序列dp

C4244:“+=”:从“std::streamsize”转换为“size_t”,可能丢失数据