結果
| 問題 |
No.709 優勝可能性
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-10-19 15:04:53 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,249 bytes |
| コンパイル時間 | 2,070 ms |
| コンパイル使用メモリ | 203,956 KB |
| 最終ジャッジ日時 | 2025-01-06 14:35:44 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 15 TLE * 7 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
signed main() {
ios::sync_with_stdio(false);
int N, M;
cin >> N >> M;
vector<vector<int>> R(N, vector<int>(M));
for (int i = 0; i < N; ++i)
for (int j = 0; j < M; ++j)
cin >> R[i][j];
vector<tuple<vector<int>, int>> dp(1 << M);
for (int s = 1; s < 1 << M; ++s) dp[s] = make_tuple(vector<int>(M), 0);
for (int i = 0; i < N; ++i) {
int ans = 0;
for (int s = 1; s < 1 << M; ++s) {
bool ng = false;
bool better = false;
vector<int> cur(M);
vector<int> xxx(M);
for (int j = 0; j < M; ++j) {
if (s >> j & 1) {
cur[j] = R[i][j];
xxx[j] = max(R[i][j], get<0>(dp[s])[j]);
ng |= R[i][j] < get<0>(dp[s])[j];
better |= R[i][j] > get<0>(dp[s])[j];
}
}
if (!ng && better) dp[s] = make_tuple(cur, 1);
else if (!ng && !better) ++get<1>(dp[s]);
else if (ng && better) dp[s] = make_tuple(xxx, 0);
ans += (__builtin_popcount(s) & 1 ? 1 : -1) * get<1>(dp[s]);
// cout << "dp[" << i << "][" << s << "] = " << get<0>(dp[s])[0] << " " << get<0>(dp[s])[1] << " " << get<0>(dp[s])[2] << " " << get<1>(dp[s]) << endl;
}
cout << ans << endl;
}
return 0;
}