3 solutions

  • 0
    @ 2025-11-19 21:30:19

    前缀和->max前i-1个最大值,倒数(n-i+1)个最大值 1.设置1+n个结点acc(前缀和),每个结点表示在此i结点上需要acc[i]才能到达下一节点,结点acc[0]为a[0],其余1~n的acc[i] = acc[i-1] + a[i] - b[i] 2.求得prefix[i](i属于0~n),prefix[0] =acc[0],其余prefix[i] = max(prefix[i-1] +,acc[i]),表示前i-1至少要满足的和通过结点i需要满足的能量,即为前i个,subfix同理 3.当结点i同学没睡,无法得到b[i],此时对前i-1个结点无影响,对后面有,ans = max(prefix[i-1],sunfix[i]+b[i]),subfix为后面最大数,而因为从i处无法得到b[i],则后面所有数包括subfix[i],都要+b[i].

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main(){
        int n;
        cin>>n;
        vector<int> a(n+1);
        vector<int> b(n+1);
        for(int i= 0;i<=n;i++){
            cin>>a[i];
        }
        for(int i= 1;i<=n;i++){
            cin>>b[i];
        }
        vector<int> acc(n+1);
        vector<int> prefix(1+n);
        vector<int> subfix(1+n);
    
        acc[0] = a[0];
        prefix[0] = a[0];
        for(int i = 1;i <= n;i++){
            acc[i] = acc[i-1] + a[i] - b[i];
            prefix[i] = max(prefix[i-1],acc[i]);
        }
        subfix[n] = acc[n];
        for(int i = n-1;i>0;i--){
            subfix[i] = max(subfix[i+1],acc[i]);
        }
        int ans;
        for(int i = 1;i<=n;i++){
            ans = max(prefix[i-1],subfix[i]+b[i]);
            cout<<ans<<' ';
        }
    }
    
    

    Information

    ID
    41
    Time
    1000ms
    Memory
    512MiB
    Difficulty
    2
    Tags
    # Submissions
    232
    Accepted
    54
    Uploaded By