This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |