Submission #608867

#TimeUsernameProblemLanguageResultExecution timeMemory
608867BERNARB01Popeala (CEOI16_popeala)C++17
17 / 100
2063 ms1620 KiB
#include <bits/stdc++.h> using namespace std; #ifdef B01 #include "../debb.h" #else #define deb(...) #endif class segtree { public: struct node { long long mn = 0; long long add = 0; void apply(int l, int r, long long v) { add += v; mn += v; } }; node unite(const node& a, const node& b) const { node res; res.mn = min(a.mn, b.mn); return res; } inline void push(int x, int l, int r) { int y = (l + r) >> 1; int z = x + ((y - l + 1) << 1); if (tr[x].add != 0) { tr[x + 1].apply(l, y, tr[x].add); tr[z].apply(y + 1, r, tr[x].add); tr[x].add = 0; } } inline void pull(int x, int z) { tr[x] = unite(tr[x + 1], tr[z]); } int n; vector<node> tr; void build(int x, int l, int r) { if (l == r) { return; } int y = (l + r) >> 1; int z = x + ((y - l + 1) << 1); build(x + 1, l, y); build(z, y + 1, r); pull(x, z); } template <typename M> void build(int x, int l, int r, const vector<M> &v) { if (l == r) { tr[x].apply(l, r, v[l]); return; } int y = (l + r) >> 1; int z = x + ((y - l + 1) << 1); build(x + 1, l, y, v); build(z, y + 1, r, v); pull(x, z); } node get(int x, int l, int r, int ll, int rr) { if (ll <= l && r <= rr) { return tr[x]; } int y = (l + r) >> 1; int z = x + ((y - l + 1) << 1); push(x, l, r); node res{}; if (rr <= y) { res = get(x + 1, l, y, ll, rr); } else { if (ll > y) { res = get(z, y + 1, r, ll, rr); } else { res = unite(get(x + 1, l, y, ll, rr), get(z, y + 1, r, ll, rr)); } } pull(x, z); return res; } template <typename... M> void imodify(int x, int l, int r, int ll, int rr, const M&... v) { if (ll <= l && r <= rr) { tr[x].apply(l, r, v...); return; } int y = (l + r) >> 1; int z = x + ((y - l + 1) << 1); push(x, l, r); if (ll <= y) { imodify(x + 1, l, y, ll, rr, v...); } if (rr > y) { imodify(z, y + 1, r, ll, rr, v...); } pull(x, z); } template <typename M> segtree(const vector<M> &v) { n = v.size(); assert(n > 0); tr.resize(2 * n - 1); build(0, 0, n - 1, v); } node get(int ll, int rr) { assert(0 <= ll && ll <= rr && rr <= n - 1); return get(0, 0, n - 1, ll, rr); } node get(int p) { assert(0 <= p && p <= n - 1); return get(0, 0, n - 1, p, p); } template <typename... M> void modify(int ll, int rr, const M&... v) { assert(0 <= ll && ll <= rr && rr <= n - 1); imodify(0, 0, n - 1, ll, rr, v...); } }; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, tt, s; cin >> n >> tt >> s; vector<int> rsc(tt); for (int i = 0; i < tt; i++) { cin >> rsc[i]; } vector<vector<int>> pts(tt, vector<int>(n)); for (int i = 0; i < n; i++) { string t; cin >> t; for (int j = 0; j < tt; j++) { pts[j][i] = (t[j] - '0') * rsc[j]; } } vector<long long> dp(tt); vector<int> ss(n); int zz = 0; for (int i = 0; i < tt; i++) { for (int j = 0; j < n; j++) { if (pts[i][j] == 0) { if (ss[j] != -1) { zz -= ss[j]; ss[j] = -1; } } else { if (ss[j] != -1) { ss[j] += pts[i][j]; zz += pts[i][j]; } } } dp[i] = zz; } cout << dp.back() << '\n'; for (int k = 1; k < s; k++) { for (int i = tt - 2; i >= 0; i--) { dp[i + 1] = dp[i]; } dp[0] = 0; const long long inf = (long long) 4e9L; for (int i = 0; i < k; i++) { dp[i] = inf; } segtree st(dp); vector<int> last0(n, -1); vector<long long> pd(tt, inf); for (int i = k; i < tt; i++) { for (int j = 0; j < n; j++) { if (pts[i][j]) { st.modify(last0[j] + 1, i, pts[i][j]); } else { int beg = last0[j], end = i - 1; last0[j] = i; int z = 0; while (end > beg) { z += pts[end][j]; st.modify(end, end, -z); --end; } } } pd[i] = st.get(0, i).mn; } swap(dp, pd); cout << dp.back() << '\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...