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...