Submission #1228826

#TimeUsernameProblemLanguageResultExecution timeMemory
1228826Muhammad_AneeqHomecoming (BOI18_homecoming)C++20
13 / 100
1096 ms24348 KiB
#include <iostream>
#include <deque>
#include <vector>
#include <set>
using namespace std;
int const NN=2e6+10;
long long dp[NN],pre[NN],val[NN];
long long sol(deque<int>a,deque<int>b,int k)
{
    int n=a.size();
    pre[0]=0;
    for (int i=0;i<n;i++)
        pre[i+1]=pre[i]+b[i];
    for (int i=0;i<n;i++)
        dp[i]=-1e15;
    dp[0]=a[0]-pre[k];
    multiset<long long>s;
    s.insert(dp[0]+pre[k]);
    val[0]=dp[0]+pre[k];
    long long mx=dp[0];
    for (int i=1;i<n;i++)
    {
        if (i>=k)
            s.erase(s.find(val[i-k]));
        long long sm=pre[min(n,i+k)]-pre[i];
        dp[i]=mx;
        if (s.size())
            dp[i]=max(dp[i],*rbegin(s)-pre[i]);
        dp[i]=dp[i]+a[i]-sm;
        mx=max(mx,dp[i]);
        val[i]=dp[i]+pre[min(i+k,n)];
        s.insert(val[i]);
    }
    return mx;
}
long long solve1(int N, int K, deque<int>A, deque<int>B)
{
    int n=N;
    long long dp[N+10][N+10]={};
    long long pre[2*N+10]={};
    for (int i=0;i<2*N;i++)
        pre[i+1]=pre[i]+B[i%N];
    for (int i=0;i<N;i++)
        for (int j=0;j<N;j++)
            dp[i][j]=-1e15;
    long long ans=0;
    for (int i=0;i<N;i++)
    {
        dp[i][i]=A[i]-(pre[i+K]-pre[i]);
        ans=max(ans,dp[i][i]);
    }
    for (int i=0;i<n;i++)
    {
        for (int j=i;j<n;j++)
        {
            for (int k=j+1;k<n;k++)
            {
                int l=k,r=k+K;
                l=max(l,j+K);
                r=min(r,i+n);
                long long sm=0;
                if (r>=l)
                    sm=pre[r]-pre[l];
                dp[i][k]=max(dp[i][k],dp[i][j]-sm+A[k]);
                ans=max(ans,dp[i][k]);
            }
        }
    }
    return ans;
}
long long solve(int N, int K, int *A, int *B)
{
    long long ans=0;
    int n=N;
    deque<int>a,b;
    for (int i=0;i<n;i++)
        a.push_back(A[i]),b.push_back(B[i]);
    for (int i=0;i<n;i++)
    {
        ans=max(ans,sol(a,b,K));
        a.push_back(a.front());
        a.pop_front();
        b.push_back(b.front());
        b.pop_front();
    }
    long long ans1=solve1(N,K,a,b);
    if (ans1<ans)
        exit(-1);
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...