답안 #609879

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
609879 2022-07-28T02:41:09 Z juancarlovieri 조교 (CEOI16_popeala) C++17
26 / 100
2000 ms 42744 KB
  #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() {
    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<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;
  }
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 8916 KB Output is correct
2 Correct 4 ms 9172 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 46 ms 10212 KB Output is correct
2 Correct 40 ms 10172 KB Output is correct
3 Correct 45 ms 10256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 189 ms 12932 KB Output is correct
2 Correct 339 ms 14460 KB Output is correct
3 Correct 332 ms 16236 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 8916 KB Output is correct
2 Correct 4 ms 9172 KB Output is correct
3 Correct 46 ms 10212 KB Output is correct
4 Correct 40 ms 10172 KB Output is correct
5 Correct 45 ms 10256 KB Output is correct
6 Correct 189 ms 12932 KB Output is correct
7 Correct 339 ms 14460 KB Output is correct
8 Correct 332 ms 16236 KB Output is correct
9 Correct 462 ms 20360 KB Output is correct
10 Correct 769 ms 23764 KB Output is correct
11 Correct 1465 ms 41504 KB Output is correct
12 Correct 1555 ms 42744 KB Output is correct
13 Execution timed out 2048 ms 42744 KB Time limit exceeded
14 Halted 0 ms 0 KB -