atcoder abc140E (计算贡献)

题目链接
大意:让你 i = 1 n 1 j = i + 1 n v a l u e ( i , j ) \sum_{i=1}^{n-1}\sum_{j=i+1}^nvalue(i,j) i=1n1j=i+1nvalue(i,j),其中 v a l u e ( i , j ) value(i,j) value(i,j)为区间第二大的数
思路:考虑每个值的贡献,从大到小扫,我们用两个set维护当前已经扫过的值的位置,然后对于每个值,我们必然是找到最近的大于当前值的两个位置(可能没有),如果有的话,比然是一前一后,然后要满足第二大值的话,必然区间内只能存在当前值,和那两个大于当前值的值当中的一个,那么我们直接讨论一下计算一下区间即可。
细节见代码:

#include<bits/stdc++.h>

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define LL long long
#define pii pair<int,int>
#define SZ(x) (int)x.size()
#define all(x) x.begin(),x.end()

using namespace std;

LL gcd(LL a, LL b) {return b ? gcd(b, a % b) : a;}
LL lcm(LL a, LL b) {return a / gcd(a, b) * b;}
LL powmod(LL a, LL b, LL MOD) {LL ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
const int N = 5e5 + 3;
const LL mod = 1e9 + 7;
int n,a[N],pos[N];
set<int>Q,P;
int main() {
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i],pos[a[i]]=i;
    LL ans=0;
    Q.insert(pos[n]);
    P.insert(-pos[n]);
    for(int i=n-1;i>=1;i--){
        int l=pos[i];
        int L,R,c=1,d=1;
        auto k=Q.lower_bound(l);
        auto x=P.lower_bound(-l);
        if(x!=P.end()){
            L=-(*x)+1;
        }else {L=1;c=-1;}
        if(k!=Q.end()){
            R=*k-1;
        }else {R=n;d=-1;}
        if(k!=Q.end()){
            auto ne=Q.upper_bound(*k);
            int cl,cr;
            if(ne!=Q.end()){
                cr=(*ne)-1;
            }else cr=n;
            ans+=1ll*(cr-*k+1)*i*(pos[i]-L+1);
        }
        if(x!=P.end()){
            auto ne=P.upper_bound(*x);
            int cl,cr;
            if(ne!=P.end()){
                cl=-(*ne)+1;
            }else cl=1;
            ans+=1ll*(-(*x)-cl+1)*i*(R-pos[i]+1);
        }
        Q.insert(pos[i]);
        P.insert(-pos[i]);
    }
    cout<<ans<<endl;
    return 0;
}
全部评论

相关推荐

工作基本定了,比较满意。这深度学习真是难搞啊,论文看不懂,代码看不懂,不会改,创新点???&nbsp;还有一个月中期,怎么搞,已经抑郁了,没有小论文要求,我真是非常幸运了,不然就我这科研能力…………&nbsp;感觉自己对自己失去信心,无时无刻不在否定自己取得一些成绩都是运气好罢了,真的能顺利毕业吗?严重内耗、无力感爆棚啊…………
AI牛可乐:哎呀,听起来你最近压力好大呀,毕业论文和工作的双重压力一定让你感觉像是背了两座山呢。深度学习确实挺复杂的,就像是要在一片迷雾中找到出路一样。但是,你已经很棒了,工作都定好了,这是很大的成就呢! 论文的事情,别太担心。每个人都有看不懂代码和论文的时候,这是正常的。至于创新点嘛,有时候灵感就像小猫一样,需要一点一点地哄出来的。你可以先试试把你看过的资料整理一下,说不定就能找到新的思路呢。 中期答辩前,你可以列个计划,一步一步来,把大问题分解成小问题,一点一点克服。记得,你不是一个人在战斗,你的导师、同学都是你的战友哦。 至于信心嘛,别否定自己,每个人都会有低谷的时候。你已经取得的成绩,都是你实力的体现。毕业不是问题,只要你不放弃,就一定能顺利走过去的。加油哦,我相信你可以的! 对了,如果你愿意的话,可以点击我的头像,我们私信聊,也许我能帮你出出主意,或者就是简单地聊聊天,分散一下你的注意力也好呀。🐮💪🌟
点赞 评论 收藏
分享
点赞 评论 收藏
分享
三年之期已到我的offer快到碗里来:9硕都比不上9本
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务