Submission #705183


Source Code Expand

/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            pass System Test!
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template <typename T>
std::ostream &operator<<(std::ostream &out, const std::vector<T> &v) {
  if (!v.empty()) {
    out << '[';
    std::copy(v.begin(), v.end(), std::ostream_iterator<T>(out, ", "));
    out << "\b\b]";
  }
  return out;
}
template <typename T1, typename T2>
std::ostream &operator<<(std::ostream &out, const std::pair<T1, T2> &p) {
  out << "[" << p.first << ", " << p.second << "]";
  return out;
}
template <class T, class U>
void chmin(T &t, U f) {
  if (t > f) t = f;
}

template <class T, class U>
void chmax(T &t, U f) {
  if (t < f) t = f;
}

vector<int> a, b;
const int64_t INF = 1e18;

vector<vector<map<tuple<int64_t, int64_t>, int64_t>>> dp1;
vector<vector<map<tuple<int64_t, int64_t>, int64_t>>> dp1p;
vector<vector<map<tuple<int64_t, int64_t>, int64_t>>> dp2;
vector<vector<map<tuple<int64_t, int64_t>, int64_t>>> dp2p;

int64_t dfs(bool player1, bool one_passed, int pos1, int pos2, int64_t st1,
            int64_t st2) {
  auto t = make_tuple(st1, st2);

  if (player1) {
    map<tuple<int64_t, int64_t>, int64_t> &dp =
        one_passed ? dp1p[pos1][pos2] : dp1[pos1][pos2];
    if (dp.count(t)) return dp[t];

    int64_t ret = -INF;

    // Not Pass
    if (pos1 < a.size()) {
      int card = a[pos1];
      if (card == -1) {
        // Attack Card
        chmax(ret, dfs(false, false, pos1 + 1, pos2, st1, 0));
      } else {
        // Point Card
        chmax(ret, dfs(false, false, pos1 + 1, pos2, st1 + card, st2));
      }
    }

    // Pass
    if (one_passed) {
      chmax(ret, 0);
    } else {
      if (st1 == 0 && st2 == 0)
        chmax(ret, dfs(false, true, pos1, pos2, 0, 0) + st1 - st2);
      else
        chmax(ret, dfs(false, false, pos1, pos2, 0, 0) + st1 - st2);
    }

    // cout << player1 << "," << one_passed << "," << pos1 << "," << pos2 << ","
    //      << st1 << "," << st2 << "," << p1 << "," << p2 << endl;
    // cout << ret << endl;

    dp[t] = ret;
    return ret;
  } else {
    map<tuple<int64_t, int64_t>, int64_t> &dp =
        one_passed ? dp2p[pos1][pos2] : dp2[pos1][pos2];
    if (dp.count(t)) return dp[t];
    int64_t ret = INF;

    // Not Pass
    if (pos2 < b.size()) {
      int card = b[pos2];
      if (card == -1) {
        // Attack Card
        chmin(ret, dfs(true, false, pos1, pos2 + 1, 0, st2));
      } else {
        // Point Card
        chmin(ret, dfs(true, false, pos1, pos2 + 1, st1, st2 + card));
      }
    }

    // Pass
    if (one_passed) {
      chmin(ret, 0);
    } else {
      if (st1 == 0 && st2 == 0)
        chmin(ret, dfs(true, true, pos1, pos2, 0, 0) + st1 - st2);
      else
        chmin(ret, dfs(true, false, pos1, pos2, 0, 0) + st1 - st2);
    }

    // cout << player1 << "," << one_passed << "," << pos1 << "," << pos2 << ","
    //      << st1 << "," << st2 << "," << p1 << "," << p2 << endl;
    // cout << ret << endl;

    dp[t] = ret;
    return ret;
  }
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int N, M;
  cin >> N >> M;
  a.resize(N), b.resize(M);
  for (int i = 0; i < N; ++i) cin >> a[i];
  for (int i = 0; i < M; ++i) cin >> b[i];

  dp1.resize(N + 1);
  dp1p.resize(N + 1);
  dp2.resize(N + 1);
  dp2p.resize(N + 1);
  for (int i = 0; i < N + 1; ++i) {
    dp1[i].resize(M + 1);
    dp1p[i].resize(M + 1);
    dp2[i].resize(M + 1);
    dp2p[i].resize(M + 1);
  }

  cout << dfs(true, false, 0, 0, 0, 0) << endl;
}

Submission Info

Submission Time
Task D - インビジブル
User shinsotsu
Language C++14 (GCC 5.4.1)
Score 100
Code Size 4286 Byte
Status AC
Exec Time 130 ms
Memory 12288 KiB

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 37
Set Name Test Cases
All 00_sample_00, 00_sample_01, 00_sample_02, 30_random_small_000, 30_random_small_001, 30_random_small_002, 30_random_small_003, 30_random_small_004, 30_random_small_005, 30_random_small_006, 30_random_small_007, 30_random_small_008, 30_random_small_009, 31_random_skewed_000, 31_random_skewed_001, 31_random_skewed_002, 31_random_skewed_003, 31_random_skewed_004, 32_random_skewed_000, 32_random_skewed_001, 32_random_skewed_002, 32_random_skewed_003, 32_random_skewed_004, 33_random_frequent_invisible_000, 33_random_frequent_invisible_001, 33_random_frequent_invisible_002, 33_random_frequent_invisible_003, 33_random_frequent_invisible_004, 35_random_all_invisible_000, 36_random_all_same_score_000, 37_increasing_000, 38_decreasing_000, 40_random_max_000, 40_random_max_001, 40_random_max_002, 40_random_max_003, 40_random_max_004
Case Name Status Exec Time Memory
00_sample_00 AC 4 ms 256 KiB
00_sample_01 AC 4 ms 256 KiB
00_sample_02 AC 4 ms 256 KiB
30_random_small_000 AC 4 ms 256 KiB
30_random_small_001 AC 4 ms 256 KiB
30_random_small_002 AC 5 ms 256 KiB
30_random_small_003 AC 4 ms 256 KiB
30_random_small_004 AC 4 ms 256 KiB
30_random_small_005 AC 4 ms 256 KiB
30_random_small_006 AC 4 ms 256 KiB
30_random_small_007 AC 4 ms 256 KiB
30_random_small_008 AC 4 ms 256 KiB
30_random_small_009 AC 4 ms 256 KiB
31_random_skewed_000 AC 6 ms 640 KiB
31_random_skewed_001 AC 7 ms 896 KiB
31_random_skewed_002 AC 6 ms 640 KiB
31_random_skewed_003 AC 5 ms 384 KiB
31_random_skewed_004 AC 6 ms 768 KiB
32_random_skewed_000 AC 6 ms 640 KiB
32_random_skewed_001 AC 4 ms 256 KiB
32_random_skewed_002 AC 5 ms 640 KiB
32_random_skewed_003 AC 4 ms 256 KiB
32_random_skewed_004 AC 5 ms 256 KiB
33_random_frequent_invisible_000 AC 4 ms 384 KiB
33_random_frequent_invisible_001 AC 6 ms 896 KiB
33_random_frequent_invisible_002 AC 6 ms 768 KiB
33_random_frequent_invisible_003 AC 4 ms 384 KiB
33_random_frequent_invisible_004 AC 4 ms 384 KiB
35_random_all_invisible_000 AC 5 ms 384 KiB
36_random_all_same_score_000 AC 130 ms 12288 KiB
37_increasing_000 AC 115 ms 12288 KiB
38_decreasing_000 AC 114 ms 12288 KiB
40_random_max_000 AC 12 ms 2176 KiB
40_random_max_001 AC 14 ms 2432 KiB
40_random_max_002 AC 15 ms 2688 KiB
40_random_max_003 AC 16 ms 2944 KiB
40_random_max_004 AC 14 ms 2432 KiB