区区区间间间

区区区间间间

https://ac.nowcoder.com/acm/problem/20806

思路
就是求所有子区间(区间长度大于1的子区间)的最大值减去最小值的和是多少。
我们对原式子拆分一下可得图片说明
其中max(l,r)表示区间l到r的最大值,min(l,r)表示区间l到r的最小值。
那么问题就转化为 求所有区间长度大于1的子区间的最大值之和/最小值之和。
暴力的方法就是两个for枚举起点和终点去计算,会TLE
考虑单调栈,单调栈维护什么? 维护以a[i]为区间的最大值,往左右两边去更新拓展。
正着跑一次单调栈,倒着跑一次单调栈就能维护出来l和r数组。
其中l[i]表示以a[i]为最大值,左边最多延伸到l[i],r[i]表示以a[i]为最大值,右边最多延伸到r[i]
然后怎么计算呢?
右两种情况。
① a[i]作为一个区间的端点,那么可以选择的区间另一个端点就是r[i]-l[i]。
② a[i]作为区间中的一点,也就是区间的端点都没选。那么就是在l[i]到i之间选一个作为左端点,r[i]-i之间选一个作为右端点,乘法原理可得区间的个数为 (r[i]-i) * (i-l[i])
这样就处理出来拆分出来的和式的第一部分了。
第二部分怎么求?
让a[i]=-a[i],那么求最小值,就等于取反后的求最大值,在跑一下上面的过程就好了。

#include<bits/stdc++.h>
using namespace std;
#define int long long 
int a[1<<17];
int l[1<<17],r[1<<17];
int n;
int  solve(){

     for(int i=1;i<=n;i++){
            int j=i;
            while(j>1 && a[j-1]<=a[i])
                    j=l[j-1];
            l[i]=j;
        }
        for(int i=n;i;i--){
            int j=i;
            while(j<n && a[j+1]<a[i])
                 j=r[j+1];
            r[i]=j;
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            //cout<<l[i]<<" "<<r[i]<<endl;
             ans += a[i]*(r[i]-l[i]);
             ans += a[i]*(i-l[i])*(r[i]-i);
        }
    return ans;
}
signed main(){

    int t;cin>>t;
    while(t--){
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        int ans=solve();
        for(int i=1;i<=n;i++) a[i]=-a[i];
        cout<<ans+solve()<<endl;
    }
    return 0;
}
全部评论
请问这种方法不也是两重循环吗?为什么不会超时
点赞 回复 分享
发布于 2022-02-03 17:29
同问
点赞 回复 分享
发布于 2021-05-15 15:53
请问一下solve 函数里面 第一个for里面的while是 a[i]>=a[j-1] 为啥第二个for里面的while是 a[i]>a[j+1],为啥不能取a[i]>=a[j+1]呢?
点赞 回复 分享
发布于 2020-07-15 09:06

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
21
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务