제출 #1208814

#제출 시각아이디문제언어결과실행 시간메모리
1208814anonymous321Tricks of the Trade (CEOI23_trade)C++20
25 / 100
1070 ms2162688 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll INF = numeric_limits<ll>::max()/4; int main() { int n, k; cin >> n >> k; vector<ll> vc (n); for (int i = 0; i < n; i++) { cin >> vc[i]; } vector<ll> vs (n); for (int i = 0; i < n; i++) { cin >> vs[i]; } vector<ll> p (n+1, 0); for (int i = 0; i < n; i++) { p[i+1] = p[i] - vc[i]; } vector<vector<ll>> dp (k, vector<ll> (n, -INF)); vector<vector<int>> dp_p (k, vector<int> (n, -1)); for (int i = 0; i < n; i++) { dp[0][i] = vs[i] - vc[i]; } for (int i = 1; i < k; i++) { ll mval = -INF; int mid = -1; for (int j = 0; j < n; j++) { dp[i][j] = mval + p[j+1] + vs[j]; dp_p[i][j] = mid; ll x = dp[i - 1][j] - p[j+1]; if (mval < x) { mval = x; mid = j; } } } vector<bool> sol (n-1, false); sol[n-1] = true; int cur = n-1; int curk = k-1; while (dp_p[curk][cur] != -1) { cur = dp_p[curk][cur]; curk--; sol[cur]= true; } cout << *max_element(dp[k-1].begin(), dp[k-1].end()) << "\n"; for (int i = 0; i < n; i++) { if (sol[i]) cout << 1; else cout << 0; } cout << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...