제출 #61687

#제출 시각아이디문제언어결과실행 시간메모리
61687hamzqq9Homecoming (BOI18_homecoming)C++14
62 / 100
1075 ms79052 KiB
#include "homecoming.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000000000000000
#define umax(x,y) x=max(x,(y))
#define pw(x) (1<<(x))

ll psum[2000002],psum2[2000002];
ll dp[2][2000002];

long long solve(int N, int K, int *A, int *B) {
  
  ll res=0;

  for(int i=1;i<=N;i++) {psum[i]=psum[i-1]+B[i-1];psum2[i]=psum2[i-1]+A[i-1];}
  
  for(int j=0;j<=K;j++) {
    
    for(int i=1;i<=N+1;i++) for(int t=0;t<2;t++) dp[t][i]=-inf; 

    dp[1][j+1]=(j-K+1>=1?A[j-K+1-1]:0)-psum[j];

    for(int i=j+1;i<=N;i++) {

      if(dp[1][i]!=-inf) {

        if(i<N) umax(dp[1][i+1],dp[1][i]-B[i-1]+(i-K+1>=1?A[i-K+1-1]:0));
        else {
          
          int amount=max(0,min(j+1,K));

          umax(dp[1][N+1],dp[1][i]-B[i-1]+psum2[i-K+amount]-psum2[i-K]);

        }

        umax(dp[0][i+1],dp[1][i]);

      }

      if(dp[0][i]!=-inf) {

        if(i+K<=N) {

          umax(dp[1][i+K],dp[0][i]+A[i-1]-(psum[i+K-1]-psum[i-1]));

        }
        else {

          int amount=max(0,min(N+1-i,j+N+1-i-K+1));

          umax(dp[1][N+1],dp[0][i]+psum2[i+amount-1]-psum2[i-1]-(psum[N]-psum[i-1]));

        }

        umax(dp[0][i+1],dp[0][i]);

      }

    }

    umax(res,max(dp[0][N+1],dp[1][N+1]));

  }
  
  umax(res,psum2[N]-psum[N]);

  return res;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...