제출 #1228241

#제출 시각아이디문제언어결과실행 시간메모리
1228241Muhammad_AneeqHomecoming (BOI18_homecoming)C++20
0 / 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-1]));
    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 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();
  }
  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...