【代码源 Div1#103】子串的最大差 Codeforces - 817D,力扣2104,1900分

举报
小哈里 发表于 2022/05/10 23:18:26 2022/05/10
【摘要】 problem 视频讲解链接:https://www.bilibili.com/video/BV1Du411X7Nk solution 可以直接推导原答案ans = ...

problem

在这里插入图片描述

在这里插入图片描述
视频讲解链接:https://www.bilibili.com/video/BV1Du411X7Nk

solution

  • 可以直接推导原答案ans = ∑ i = 1 n ∑ j = i n ( m a x − m i n ) = ∑ i = 1 n ∑ j = i n m a x − ∑ i = 1 n ∑ j = i n m i n \sum_{i=1}^n\sum_{j=i}^n(max-min) = \sum_{i=1}^n\sum_{j=i}^nmax-\sum_{i=1}^n\sum_{j=i}^nmin i=1nj=in(maxmin)=i=1nj=inmaxi=1nj=inmin,即对于每一段来说的最大值和最小值。

  • 或者从贡献的角度考虑:对于一个数Ai来讲,如果其有贡献的价值,要么是-Ai作为最小值,要么是+Ai作为最大值。
    那么Ans=ΣAi*maxn-Ai*minn,这里maxn表示Ai作为最大值出现的次数,minn表示Ai作为最小值出现的次数。

  • 考虑如何计算这个maxn和minn
    我们设定L【i】表示Ai作为最大值时,左边可以延展到的位子,R【i】表示Ai作为最大值时,右边可以延展到的位子。
    那么对于Ai来讲,其maxn=(i-L【i】+1)-(R【i】-i+1);
    L【i】以及R【i】都可以O(n)维护。
    那么求minn的过程同理相反。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e6+10;
LL a[maxn], l[maxn], r[maxn];
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n;  cin>>n;
    for(int i = 1; i <= n; i++)cin>>a[i];
    LL ans = 0;
    //maxn
    for(LL i = 1; i <= n; i++)l[i]=r[i]=i;
    for(int i = 2; i <= n; i++){
        int now = i;
        while(now>1&&a[i]>=a[now-1])now=l[now-1];
        l[i] = now;
    }
    for(int i = n-1; i >= 1; i--){
        int now = i;
        while(now<n&&a[i]>a[now+1])now=r[now+1];
        r[i] = now;
    }
    for(LL i = 1; i <= n; i++){
        ans += a[i]*(i-l[i]+1)*(r[i]-i+1);
    }
    //minn
    for(LL i = 1; i <= n; i++)l[i]=r[i]=i;
    for(int i = 2; i <= n; i++){
        int now = i;
        while(now>1&&a[i]<=a[now-1])now=l[now-1];
        l[i] = now;
    }
    for(int i = n-1; i >= 1; i--){
        int now = i;
        while(now<n&&a[i]<a[now+1])now=r[now+1];
        r[i] = now;
    }
    for(LL i = 1; i <= n; i++){
        ans -= a[i]*(i-l[i]+1)*(r[i]-i+1);
    }
    cout<<ans<<"\n";
    return 0;
}




  

文章来源: gwj1314.blog.csdn.net,作者:小哈里,版权归原作者所有,如需转载,请联系作者。

原文链接:gwj1314.blog.csdn.net/article/details/123450717

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。