Submission #1228802

#TimeUsernameProblemLanguageResultExecution timeMemory
1228802Muhammad_AneeqHomecoming (BOI18_homecoming)C++20
0 / 100
1093 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+1]);
    dp[i]=dp[i]+a[i]-sm;
    mx=max(mx,dp[i]);
    val[i]=dp[i]+sm;
    s.insert(dp[i]+sm);
  }
  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...