QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#419393#4858. Poker Game: Decisionbinminh01WA 1ms4192kbC++2311.1kb2024-05-23 21:21:532024-05-23 21:21:56

Judging History

你现在查看的是最新测评结果

  • [2024-05-23 21:21:56]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:4192kb
  • [2024-05-23 21:21:53]
  • 提交

answer

#pragma GCC optimize("Ofast,unroll-loops")
 
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define int128 __int128_t
#define double long double
#define gcd __gcd
#define lcm(a, b) ((a)/gcd(a, b)*(b))
#define sqrt sqrtl
#define log2 log2l
#define log10 log10l
#define floor floorl
#define to_string str
#define yes cout << "YES"
#define no cout << "NO"
#define trav(i, a) for (auto &i: (a))
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define sz(a) (int)a.size()
#define Max(a) *max_element(all(a))
#define Min(a) *min_element(all(a))
#define Find(a, n) (find(all(a), n) - a.begin())
#define Count(a, n) count(all(a), n)
#define Upper(a, n) (upper_bound(all(a), n) - a.begin())
#define Lower(a, n) (lower_bound(all(a), n) - a.begin())
#define next_perm(a) next_permutation(all(a))
#define prev_perm(a) prev_permutation(all(a))
#define sorted(a) is_sorted(all(a))
#define sum(a) accumulate(all(a), 0)
#define sumll(a) accumulate(all(a), 0ll)
#define Sort(a) sort(all(a))
#define Reverse(a) reverse(all(a))
#define Unique(a) Sort(a), (a).resize(unique(all(a)) - a.begin())
#define pb push_back
#define eb emplace_back
#define popcount __builtin_popcount
#define popcountll __builtin_popcountll
#define clz __builtin_clz
#define clzll __buitlin_clzll
#define ctz __builtin_ctz
#define ctzll __builtin_ctzll
#define open(s) freopen(s, "r", stdin)
#define write(s) freopen(s, "w", stdout)
#define fileopen(s) open((string(s) + ".inp").c_str()), write((string(s) + ".out").c_str());
#define For(i, a, b) for (auto i = (a); i < (b); i++)
#define Fore(i, a, b) for (auto i = (a); i >= (b); i--)
#define FOR(i, a, b) for (auto i = (a); i <= (b); i++)
#define ret(s) return void(cout << s);

const int mod = 1e9 + 7, mod2 = 998244353;
const double PI = acos(-1), eps = 1e-9;
const ull npos = string::npos;
const int dx[] = {0, 0, -1, 1}, dy[] = {-1, 1, 0, 0};
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using cd = complex<double>;
mt19937 mt(chrono::system_clock::now().time_since_epoch().count());
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef vector<double> vdo;
typedef vector<vdo> vvdo;
typedef vector<string> vs;
typedef vector<pii> vpair;
typedef vector<vpair> vvpair;
typedef vector<bool> vb;
typedef vector<vb> vvb;
typedef vector<char> vc;
typedef vector<vc> vvc;
typedef vector<cd> vcd;
typedef priority_queue<int> pq;
typedef priority_queue<int, vi, greater<int>> pqg;
typedef priority_queue<ll> pqll;
typedef priority_queue<ll, vll, greater<ll>> pqgll;

ll add(ll a, ll b, int m) {if (a >= m) a%=m;if (b >= m) b%=m;a+=b;return a >= m ? a - m: a;}
ll sub(ll a, ll b, int m) {if (a >= m) a%=m;if (b >= m) b%=m;a-=b;return a < 0 ? a + m: a;}
ll mul(ll a, ll b, int m) {if (a >= m) a%=m;if (b >= m) b%=m;return a*b % m;}
ll bin_mul(ll a, ll b, ll m) {if (a >= m) a%=m;if (b >= m) b%=m;ll x = 0;while (b) {if (b & 1) x = (x + a) % m;a = (a + a) % m;b>>=1;}return x;}
ll power(ll a, ll b, int m) {ll x = 1;if (a >= m) a%=m; while (b) {if (b & 1) x = x*a % m;a = a*a % m;b>>=1;}return x;}
ll power(ll a, ll b) {ll x = 1;while (b) {if (b & 1) x = x*a;a = a*a;b>>=1;}return x;}
ll ceil(ll a, ll b) {return (a + b - 1)/b;}
ll to_int(const string &s) {ll x = 0; for (int i = (s[0] == '-'); i < sz(s); i++) x = x*10 + s[i] - '0';return x*(s[0] == '-' ? -1: 1);}
bool is_prime(ll n) {if (n < 2) return 0;if (n < 4) return 1;if (n % 2 == 0 || n % 3 == 0) return 0;for (ll i = 5; i*i <= n; i+=6) {if(n % i == 0 || n % (i + 2) == 0) return 0;}return 1;}
bool is_square(ll n) {ll k = sqrt(n); return k*k == n;}
ll factorial(int n) {ll x = 1;for (int i = 2; i <= n; i++) x*=i;return x;}
ll factorial(int n, int m) {ll x = 1;for (ll i = 2; i <= n; i++) x = x*i % m;return x;}
bool is_power(ll n, ll k) {while (n % k == 0) n/=k;return n == 1ll;}
string str(ll n) {if (n == 0) return "0"; string s = ""; bool c = 0; if (n < 0) c = 1, n = -n; while (n) {s+=n % 10 + '0'; n/=10;} if (c) s+='-'; Reverse(s); return s;}
string repeat(const string &s, int n) {if (n < 0) return ""; string x = ""; while (n--) x+=s; return x;}
string bin(ll n) {string s = ""; while (n) {s+=(n & 1) + '0'; n>>=1;} Reverse(s); return s;}
void sieve(vector<bool> &a) {int n = a.size(); a[0] = a[1] = 0; for (int i = 4; i < n; i+=2) a[i] = 0; for (int i = 3; i*i < n; i+=2) {if (a[i]) {for (int j = i*i; j < n; j+=(i << 1)) a[j] = 0;}}}
void sieve(bool a[], int n) {a[0] = a[1] = 0; for (int i = 4; i < n; i+=2) a[i] = 0; for (int i = 3; i*i < n; i+=2) {if (a[i]) {for (int j = i*i; j < n; j+=(i << 1)) a[j] = 0;}}}
void sieve(vector<int> &a) {int n = a.size(); for (int i = 2; i < n; i+=2) a[i] = 2; for (int i = 3; i*i < n; i+=2) {if (!a[i]) {for (int j = i; j < n; j+=(i << 1)) a[j] = i;}} for (int i = 3; i < n; i+=2) {if (!a[i]) a[i] = i;}}
void sieve(int a[], int n) {for (int i = 2; i < n; i+=2) a[i] = 2; for (int i = 3; i*i < n; i+=2) {if (!a[i]) {for (int j = i; j < n; j+=(i << 1)) a[j] = i;}} for (int i = 3; i < n; i+=2) {if (!a[i]) a[i] = i;}}
vector<pii> factorize(int n) {vector<pii> a; for (int i = 2; i*i <= n; i++) {if (n % i == 0) {int k = 0; while (n % i == 0) k++, n/=i; a.emplace_back(i, k);}} if (n > 1) a.emplace_back(n, 1); return a;}
int rand(int l, int r) {return uniform_int_distribution<int>(l, r)(mt);}
int Log2(int n) {return 31 - __builtin_clz(n);}
template<class T> void compress(vector<T> &a) {vector<T> b; for (T &i: a) b.push_back(i); sort(all(b)); b.resize(unique(all(b)) - b.begin()); for (T &i: a) i = lower_bound(all(b), i) - b.begin() + 1;}

template<class A, class B> istream& operator>>(istream& in, pair<A, B> &p) {in >> p.first >> p.second; return in;}
template<class A, class B> ostream& operator<<(ostream& out, const pair<A, B> &p) {out << p.first << ' ' << p.second; return out;}
template<class T> istream& operator>>(istream& in, vector<T> &a) {for (auto &i: a) in >> i; return in;}
template<class T> ostream& operator<<(ostream& out, const vector<T> &a) {for (auto &i: a) out << i << ' '; return out;}
template<class T> istream& operator>>(istream& in, vector<vector<T>> &a) {for (auto &i: a) in >> i; return in;}
template<class T> ostream& operator<<(ostream& out, const vector<vector<T>> &a) {for (auto &i: a) out << i << '\n'; return out;}
template<class T> istream& operator>>(istream& in, deque<T> &a) {for (auto &i: a) in >> i; return in;}
template<class T> ostream& operator<<(ostream& out, const deque<T> &a) {for (auto &i: a) out << i << ' '; return out;}
// istream& operator>>(istream& in, __int128_t &a) {string s; in >> s; a = 0; for (auto &i: s) a = a*10 + (i - '0'); return in;}
// ostream& operator<<(ostream& out, __int128_t a) {string s = ""; while (a > 0) {s+=(int)(a % 10) + '0'; a/=10;} Reverse(s); out << s; return out;}

int r[128], f[729], q[] = {1, 3, 9, 27, 81, 243};
bool same(char a, char b, char c, char d, char e) {return a == b && a == c && a == d && a == e;}
bool stra(char a, char b, char c, char d, char e) {
    return (a == '2' && b == '3' && c == '4' && d == '5' && e == 'A') ||
    (r[a] + 1 == r[b] && r[b] + 1 == r[c] && r[c] + 1 == r[d] && r[d] + 1 == r[e]);
}
bool cmp(const string &s, const string &t) {
    return r[s[0]] < r[t[0]];
}
bool CMP(const string &s, const string &t) {
    return r[s[0]] > r[t[0]];
}
pair<int, vs> score(vs a) {
    sort(all(a), cmp);
    vs b = a; Reverse(b);
    if (a[0][0] == 'T' && a[1][0] == 'J' && a[2][0] == 'Q' && a[3][0] == 'K' && a[4][0] == 'A'
    && same(a[0][1], a[1][1], a[2][1], a[3][1], a[4][1])) return {10, a};
    if (stra(a[0][0], a[1][0], a[2][0], a[3][0], a[4][0]) && same(a[0][1], a[1][1], a[2][1], a[3][1], a[4][1])) 
        return {9, b};
    if (a[0][0] == a[3][0]) return {8, a};
    if (a[1][0] == a[4][0]) return {8, b};
    if ((a[0][0] == a[2][0] && a[3][0] == a[4][0])) return {7, a};
    if ((a[0][0] == a[1][0] && a[2][0] == a[4][0])) return {7, b};
    if (same(a[0][1], a[1][1], a[2][1], a[3][1], a[4][1])) return {6, b};
    if (stra(a[0][0], a[1][0], a[2][0], a[3][0], a[4][0])) return {5, b};
    if (a[0][0] == a[2][0]) {
        if (r[a[3][0]] < r[a[4][0]]) swap(a[3], a[4]);
        return {4, a};
    }
    if (a[1][0] == a[3][0]) {
        a.pb(a[0]); a.erase(a.begin());
        if (r[a[3][0]] < r[a[4][0]]) swap(a[3], a[4]);
        return {4, a};
    }
    if (a[2][0] == a[4][0]) {
        a.pb(a[0]); a.pb(a[1]); a.erase(a.begin(), a.begin() + 2);
        if (r[a[3][0]] < r[a[4][0]]) swap(a[3], a[4]);
        return {4, a};
    }
    vpair p;
    For(i,0,5){
        For(j,i+1,5){
            if (a[i][0] == a[j][0]) p.eb(i, j);
        }
    }
    if (sz(p) == 2) {
        vs c{a[p[0].first], a[p[0].second], a[p[1].first], a[p[1].second]};
        For(i,0,5){
            if (i != p[0].first && i != p[0].second && i != p[1].first && i != p[1].second) {
                c.pb(a[i]);
                break;
            }
        }
        if (r[c[0][0]] < r[c[2][0]]) swap(c[0], c[2]), swap(c[1], c[3]);
        return {3, c};
    }
    if (sz(p) == 1) {
        vs c{a[p[0].first], a[p[0].second]};
        For(i,0,5){
            if (i != p[0].first && i != p[0].second) c.pb(a[i]);
        }
        sort(c.begin() + 2, c.end(), CMP);
        return {2, c};
    }
    return {1, b};
}
int ck(vs a, vs b) {
    auto p = score(a), q = score(b);
    if (p.first != q.first) return p.first < q.first;
    For(i,0,5){
        if (p.second[i][0] != q.second[i][0]) return r[p.second[i][0]] < r[q.second[i][0]];
    }
    return 2;
}
vs a(2), b(2), c(6);
vi make(int n) {
    vi d(6);
    Fore(i,5,0){
        d[i] = n/q[i];
        n%=q[i];
    }
    return d;
}
int run(int m) {
    if (f[m] != -1) return f[m];
    vi d = make(m);
    if (Find(d, 2) == 6) {
        vs x = a, y = b;
        For(i,0,6){
            if (!d[i]) x.pb(c[i]);
            else y.pb(c[i]);
        }
        return (f[m] = ck(x, y));
    }
    int u = 0, v = 0;
    For(i,0,6){
        if (!d[i]) u++;
        if (d[i] == 1) v++;
    }
    if (u == v) {
        For(i,0,6){
            if (d[i] == 2) {
                int w = run(m - 2*q[i]);
                if (f[m] == -1) f[m] = w;
                else if (f[m] == 1 && w != 1) f[m] = w;
                else if (f[m] == 2 && w == 0) f[m] = w;
            }
        }
    } else {
        For(i,0,6){
            if (d[i] == 2) {
                int w = run(m - q[i]);
                if (f[m] == -1) f[m] = w;
                else if (f[m] == 0 && w != 0) f[m] = w;
                else if (f[m] == 2 && w == 1) f[m] = w;
            }
        }
    }
    return f[m];
}
void solve() {
    cin >> a >> b >> c;
    memset(f, -1, sizeof(f));
    int w = run(728);
    cout << (w == 0 ? "Alice": w == 1 ? "Bob": "Draw");
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
    cout << fixed << setprecision(10);
    FOR(i,2,9) r[i + '0'] = i;
    r['T'] = 10; r['J'] = 11; r['Q'] = 12; r['K'] = 13; r['A'] = 14;
    int T = 1;
    cin >> T;
    while (T--) {
        solve();
        cout << '\n';
    }
    cerr << "Process returned 0 (0x0)   execution time :  " << 0.001*clock() << " s";
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 4192kb

input:

9
JC 4H
TS 5D
JS JH JD 4S 4C 4D
JC 4H
TS 5D
TH TC TD 5S 5H 5C
JC 4H
TS 5D
4S JS 5S TH TC TD
7C 3C
7H TH
3S 3H 3D 2C 4H 5S
7C 3C
7H TH
2H 4H 5H 6H 8H 9H
7C 3C
7H TH
TS 3S 2S 2H 4C 4D
2D KH
4D JC
2S 2H 2C KS KC KD
2D KH
4D JC
4S 4H 4C JS JH JD
2D KH
4D JC
2S KS 4S JS JH JD

output:

Alice
Bob
Draw
Alice
Bob
Draw
Alice
Bob
Draw

result:

ok 9 lines

Test #2:

score: -100
Wrong Answer
time: 1ms
memory: 4048kb

input:

1
AS 2H
2S 6H
3S 3H 4S 4H 5S 5H

output:

Alice

result:

wrong answer 1st lines differ - expected: 'Bob', found: 'Alice'