1 条题解

  • 0
    @ 2026-4-25 23:48:54

    题面展示

    你有三个长度为 nn 的数组 DDLLRR,下标从 11 开始。同时给定整数 a0a_{0}b0b_{0}。你需要按如下规则构造两个长度为 n+1n+1 的数组 AABB

    • A0=a0A_{0} = a_{0}B0=b0B_{0} = b_{0}
    • 对于所有 1in1 \leq i \leq n,依次进行以下操作:
      • Ai=Ai1+DiA_{i} = A_{i-1} + D_{i}Bi=Bi1+DiB_{i} = B_{i-1} + D_{i}
      • 然后恰好选择以下两种操作中的一种并应用:
        • Ai=min(Ai,Li)A_{i} = \min(A_{i}, L_{i})
        • Bi=min(Bi,Ri)B_{i} = \min(B_{i}, R_{i})

    你希望通过上述操作,构造出 AABB,使 An+BnA_{n} + B_{n} 的值最大。请你求出能够得到的 An+BnA_{n} + B_{n} 的最大值。

    解题思路

    由于我们只关心 AnA_{n},而 LiL_iAiA_i 做限制,因此考虑转而让 LiL_i 限制 AnA_n

    求出 DD 的前缀和数组 SiS_i,令 Lni=Li+DnDiLn_i = L_i + D_n - D_i. 这样就有 An=mini=1n[选择让 i 位置限制 A]LniA_n = \min_{i=1}^{n}[\text{选择让 i 位置限制 A}]Ln_i

    类似地,令 Rni=Ri+DnDiRn_i = R_i + D_n - D_i。这样就有 Bn=mini=1n[选择让 i 位置限制 B]RniB_n = \min_{i=1}^{n}[\text{选择让 i 位置限制 B}]Rn_i

    Lni,Rni{Ln_i,Rn_i} 存成一个 pair<int,int>,然后按 LniLn_i 从小到大排序。

    • 选择限制 AA 的下标是排序后的一段后缀。

    你已经限制 LniLn_i 了,假如 Lnj>LniLn_j > Ln_i,那么限制 LnjLn_j 而非 RnjRn_j 一定不劣。

    如果是这样,直接扫一遍“这个后缀的左端点”就出结果了。

    代码展示

    #include<bits/stdc++.h>
    #define int long long
    #define l first
    #define r second
    using namespace std;
    int n,k,d[1000005],a,b;
    pair<int,int>s[1000005];
    bool cmp(pair<int,int> x,pair<int,int> y){
        return x.r<y.r;
    }
    void solve(){
        cin>>n;
        for (int i=1;i<=n;i++)cin>>d[i],d[i]+=d[i-1];
        for (int i=1;i<=n;i++){
            cin>>s[i].l;
            s[i].l+=d[n]-d[i];
        }
        for (int i=1;i<=n;i++){
            cin>>s[i].r;
            s[i].r+=d[n]-d[i];
        }
        cin>>s[0].l>>s[0].r;
        s[0].l+=d[n],s[0].r+=d[n];
        sort(s+1,s+1+n);
        int x=s[0].r,ans=s[0].r;
        for (int i=1;i<=n;i++){
            if (s[i].l<s[0].l)ans=min(ans,s[i].r);
        }
        ans+=s[0].l;
        for (int i=1;i<=n;i++){
            if (s[i].l<=s[0].l){
                ans=max(ans,x+s[i].l);
                x=min(x,s[i].r);
            }
            else break;
        }
        cout<<ans<<"\n";
    }
    signed main(){
        ios::sync_with_stdio(0);
        cin.tie(0);
        int t=1;
        while (t--)solve();
        return 0;
    }
    
    • 1

    信息

    ID
    11046
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者