Submission #610077

#TimeUsernameProblemLanguageResultExecution timeMemory
610077juancarlovieriPopeala (CEOI16_popeala)C++17
100 / 100
1986 ms35944 KiB
#include <bits/stdc++.h> using namespace std; #define min(a, b) (a < b ? a : b) #define ll long long int n, t, s; int pts[20005]; ll pre[20005]; int nxt[55][20005]; int can[55][20005]; ll dp[20005][55]; // struct Point { // int x, c; // int eval (int m) { // return m * x + c; // } // }; // int rek(int cur, int gr) { // if (cur >= t) { // if (gr != 0) return 1e12; // // if (gr == s) return 1e12; // return 0; // } // if (gr == 0) return 1e12; // ll& res = dp[cur][gr]; // if (res != -1) return res; // res = 1e12; // res = min(1ll * res, 1ll * rek(cur + 1, gr - 1) + 1ll * pts[cur] * n); // vector<int> block; // for (int i = 0; i < n; ++i) { // block.push_back(nxt[i][cur]); // } // sort(block.begin(), block.end()); // // cout << "LST FOR " << cur << endl; // // for (auto i : block) cout << i << ' '; // // cout << endl; // // for (int i = cur; i < t; ++i) { // // block.push_back(i); // // } // int act = n; // vector<int> vis(n); // for (auto i : block) { // if (i == t) break; // for (int j = 0; j < n; ++j) { // if (vis[j]) continue; // if (nxt[j][i] <= i) { // vis[j] = 1; // --act; // } // } // // --act; // res = min(1ll * res, 1ll * rek(i + 1, gr - 1) + 1ll * (pre[i] - (cur ? (pre[cur - 1]) : 0)) * act); // // cout << "CUR " << cur << endl; // // cout << i << ' ' << act << ' ' << 1ll * rek(i + 1, gr - 1) + 1ll * (pre[i] - (cur ? (pre[cur - 1]) : 0)) * act << endl; // } // // cout << endl; // res = min(1ll * res, 1ll * rek(t, gr - 1) + 1ll * (pre[t - 1] - (cur ? pre[cur - 1] : 0)) * act); // // cout << act << endl; // return res; // } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); // memset(dp, -1, sizeof dp); cin >> n >> t >> s; for (int i = 0; i < t; ++i) cin >> pts[i]; pre[0] = pts[0]; for (int i = 1; i < t; ++i) pre[i] = pre[i - 1] + pts[i]; for (int i = 0; i < n; ++i) { string s; cin >> s; for (int j = 0; j < t; ++j) { if (s[j] == '0') can[i][j] = 0; else can[i][j] = 1; } } for (int i = 0; i < n; ++i) { nxt[i][t] = t; for (int j = t - 1; j >= 0; --j) { if (can[i][j] == 0) nxt[i][j] = j; else nxt[i][j] = nxt[i][j + 1]; } } for (int i = 0; i <= t; ++i) { for (int j = 0; j <= s; ++j) { dp[i][j] = 1e12; } } dp[t][0] = 0; vector<vector<ll>> hasil(t, vector<ll>(n + 3, 1e12)); for (int gr = 1; gr <= s; ++gr) { for (int cur = t - 1; cur >= 0; --cur) { ll& res = dp[cur][gr]; res = 1e12; res = min(1ll * res, 1ll * dp[cur + 1][gr - 1] + 1ll * pts[cur] * n); vector<int> block; for (int i = 0; i < n; ++i) { block.push_back(nxt[i][cur]); } sort(block.begin(), block.end()); // cout << "LST FOR " << cur << endl; // for (auto i : block) cout << i << ' '; // cout << endl; // for (int i = cur; i < t; ++i) { // block.push_back(i); // } int act = n; vector<int> vis(n); int last = -1; for (auto i : block) { if (i == t) break; if (last == -1) last = i; else { // puts("TES"); res = min(1ll * res , 1ll * hasil[last][act] - 1ll * (((cur) ? (pre[cur - 1]) : 0)) * act); // cout << gr << ' ' << act << ' ' << cur << ' ' << i << ' ' << hasil[act][cur] << endl; // cout << hasil[act][act] - 1ll * (((cur) ? (pre[cur - 1]) : 0)) * act << endl; } last = i; // for (int j = 0; j < n; ++j) { // if (vis[j]) continue; // if (nxt[j][i] <= i) { // vis[j] = 1; // --act; // } // } --act; res = min(1ll * res, 1ll * dp[i + 1][gr - 1] + 1ll * (pre[i] - (cur ? (pre[cur - 1]) : 0)) * act); // cout << "CUR " << cur << endl; // cout << i << ' ' << act << ' ' << 1ll * rek(i + 1, gr - 1) + 1ll * (pre[i] - (cur ? (pre[cur - 1]) : 0)) * act << endl; } if (last != -1) { res = min(1ll * res, hasil[last][act] - 1ll * (((cur) ? (pre[cur - 1]) : 0)) * act); // cout << hasil[act][cur] - 1ll * (((cur) ? (pre[cur - 1]) : 0)) * act << endl; } // cout << endl; res = min(1ll * res, 1ll * dp[t][gr - 1] + 1ll * (pre[t - 1] - (cur ? pre[cur - 1] : 0)) * act); // cout << act << endl; // return res; } hasil = vector<vector<ll>>(t, vector<ll>(n + 3, 1e12)); for (int i = t - 1; i >= 0; --i) { for (int j = 0; j <= n; ++j) { if (i < t - 1) hasil[i][j] = hasil[i + 1][j]; hasil[i][j] = min(hasil[i][j], dp[i + 1][gr] + j * pre[i]); } } } // cout << rek(2, 1) << endl; // cout << rek(0, 2) << endl; // for (int i = 1; i <= s; ++i) { // cout << rek(0, i) << endl; // } for (int i = 1; i <= s; ++i) { cout << dp[0][i] << endl; } // cout << rek(0, 0) << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...