Submission #609877

#TimeUsernameProblemLanguageResultExecution timeMemory
609877juancarlovieriPopeala (CEOI16_popeala)C++17
26 / 100
2069 ms43784 KiB
#include <bits/stdc++.h>
using namespace std;
  
#define int long long

int n, t, s;
int pts[20005];
int pre[20005];
int nxt[55][20005];
int can[55][20005];
int 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;
  int& 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() {
  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<int>> hasil(t, vector<int>(n + 3, 1e12));

  for (int gr = 1; gr <= s; ++gr) {
    for (int cur = 0; cur < t; ++cur) {
      int& 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(res , 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(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<int>>(t, vector<int>(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...