제출 #1138490

#제출 시각아이디문제언어결과실행 시간메모리
1138490poatHomecoming (BOI18_homecoming)C++17
100 / 100
191 ms157004 KiB
#include <bits/stdc++.h>
#include "homecoming.h"
using namespace std;

long long pref[2000010];
int n, k;
   
long long sup(int i)
{
    if(i + k - 1 < n)
        return (pref[i + k - 1] - (i == 0 ? 0 : pref[i - 1]));
    return pref[n - 1] - pref[i - 1] + pref[k - (n - i) - 1];
}

long long f(int i, int x, int y, int arri, int barri)
{
    if(x == 0)
        return 0ll;
    if(y == 0)
        return (arri - sup(i));    
    return arri - barri;
}
long long f2(int i, int x, int y, int arri, int barri)
{
    if(y == 0)
        return 0ll;
    if(x == 0)
        return (arri - sup(i));
    return arri - barri;
}

long long solve(int N, int K, int *A, int *B)
{
    n = N, k = K;
    if(K == 1)
    {
        long long sum = 0;
        for(int i = 0; i < N; i++)
            sum += ((int) max(0, A[i] - B[i]));
        return sum;
    }
    
    pref[0] = B[0];
    for(int i = 1; i < N; i++)
        pref[i] = pref[i - 1] + B[i];

    long long dp1[N][2][2], dp2[N][2][2];
    for(int i = 0; i < N; i++)
    {
        for(int k2 = 0; k2 < 2; k2++)
            dp1[i][k2][0] = dp1[i][k2][1] = dp2[i][k2][0] = dp2[i][k2][1] = -1e15; 
    }
    dp1[N - 1][0][0] = 0ll;
    dp1[N - 1][1][1] = A[N - 1] - sup(N - 1);
    for(int i = N - 2; i >= 0; i--)
    {
        for(int p = 0; p < 2; p++)
        {
            for(int z = 0; z < 2; z++)
            {
                for(int h = 0; h < 2; h++)
                    dp1[i][p][z] = max(dp1[i][p][z], dp1[i + 1][h][z] + f(i, p, h, A[i], B[i])); 
            }
        }
    }
    // for(int i = 0; i < N; i++)
    // {
    //     for(int p = 0; p < 2; p++)
    //         cout << dp1[i][p][0] << ' ' << dp1[i][p][1] << ' ';
    //     cout << '\n';
    // }
    // exit(0);
    dp2[0][0][0] = 0;
    dp2[0][1][1] = A[0] - sup(0);
    for(int i = 1; i < N; i++)
    {
        for(int p = 0; p < 2; p++)
        {
            for(int z = 0; z < 2; z++)
            {
                for(int h = 0; h < 2; h++)
                    dp2[i][p][z] = max(dp2[i][p][z], dp2[i - 1][p][h] + f2(i, h, z, A[i], B[(i + k - 1) % n]));
            }
        }
    }
    long long mx = 0;
    for(int i = 0; i < N; i++)
        mx += (A[i] - B[i]);
    mx = max({mx, dp1[0][0][0], dp1[0][0][1]});
    for(int i = 1; i < N; i++)
    {
        int j = i - 1;
        for(int h = 0; h < 2; h++)
        {
            for(int z = 0; z < 2; z++)
            {
                for(int p = 0; p < 2; p++)
                {
                    long long res = dp1[i][0][h] + dp2[j][z][p];
                    if(h && z && K > 1)
                        res = res + pref[K - 2];
                    mx = max(mx, res);   
                }
            }
        }
    }
    return mx;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...