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 |
|
| 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 |