답안 #609886

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
609886 2022-07-28T02:50:04 Z juancarlovieri 조교 (CEOI16_popeala) C++17
26 / 100
2000 ms 34936 KB
  #include <bits/stdc++.h>
  using namespace std;
    
  #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 = 0; cur < t; ++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;
  }
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 8916 KB Output is correct
2 Correct 5 ms 9172 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 10004 KB Output is correct
2 Correct 38 ms 9964 KB Output is correct
3 Correct 46 ms 10004 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 196 ms 12048 KB Output is correct
2 Correct 287 ms 13240 KB Output is correct
3 Correct 415 ms 14556 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 8916 KB Output is correct
2 Correct 5 ms 9172 KB Output is correct
3 Correct 42 ms 10004 KB Output is correct
4 Correct 38 ms 9964 KB Output is correct
5 Correct 46 ms 10004 KB Output is correct
6 Correct 196 ms 12048 KB Output is correct
7 Correct 287 ms 13240 KB Output is correct
8 Correct 415 ms 14556 KB Output is correct
9 Correct 535 ms 17772 KB Output is correct
10 Correct 775 ms 20352 KB Output is correct
11 Correct 1363 ms 33908 KB Output is correct
12 Correct 1413 ms 34936 KB Output is correct
13 Execution timed out 2068 ms 34840 KB Time limit exceeded
14 Halted 0 ms 0 KB -