QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#128314#5024. 【模板】双端队列pandapythoner60 161ms20072kbC++204.6kb2023-07-20 20:37:172023-07-20 20:37:20

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-07-20 20:37:20]
  • 评测
  • 测评结果:60
  • 用时:161ms
  • 内存:20072kb
  • [2023-07-20 20:37:17]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define flt double
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()

mt19937 rnd(234);
const ll inf = 1e18;

int n;
vector<ll> a;
vector<ll> b;
vector<ll> p;
vector<ll> psms;
vector<ll> p2;
vector<vector<unordered_map<int, int>>> dp;

int get_dp(int l, int r, int xr1) {
    if (l == r) {
        return xr1;
    }
    int xr2 = xr1 ^ 1 ^ (p[r] ^ p[l]);
    auto it = dp[l][xr1].find(r);
    if (it != dp[l][xr1].end()) {
        return it->second;
    }
    int rs = 0;
    bool fndd = false;
    if ((r - l) % 2 == 0) {
        if ((p[r] ^ p[l]) == 1) {
            rs = 1;
            fndd = true;
        } else {
            
            auto it = dp[l][xr1 ^ 1].find(r);
            if(it != dp[l][xr1 ^ 1].end()){
                rs = (it->second ^ 1);
                fndd = true;
            }

            int x = 1;
            int cnt = psms[r] - psms[l];
            if (((cnt / 2) & 1) ^ xr1 == 1) {
                rs = 1;
                fndd = true;
            } else if(cnt == 0) {
                rs = 0;
                fndd = true;
            }
            
            ll f = p2[r] ^ p2[l];
            if (f ^ xr1 == 1) {
                rs = 1;
                fndd = true;
            } else {
                // rs = 0;
                // fndd = true;
            }
        }
    }
    int t = 0;
    for (int i = 0; i < 2; i += 1) {
        if (t == 0) {
            if (!fndd && get_dp(l + 1, r, xr2) == 0) {
                rs = 1;
                fndd = true;
            }
        } else {
            if (!fndd && get_dp(l, r - 1, xr2) == 0) {
                rs = 1;
                fndd = true;
            }
        }
        t ^= 1;
    }
    dp[l][xr1][r] = rs;
    return rs;
}

int solve_slow() {
    ll xrall = 0;
    for (int i = 0; i < n; i += 1) {
        xrall ^= a[i];
    }
    if (xrall == 0) {
        return -1;
    }
    int bt = 0;
    while ((1 << bt) <= xrall) {
        bt += 1;
    }
    bt -= 1;
    b.resize(n);
    for (int i = 0; i < n; i += 1) {
        b[i] = ((a[i] >> bt) & 1);
    }
    p.resize(n + 1);
    psms.resize(n + 1);
    p[0] = 0;
    psms[0] = 0;
    p2.resize(n + 2);
    p2[0] = p2[1] = 0;
    for (int i = 0; i < n; i += 1) {
        p[i + 1] = p[i] ^ b[i];
        psms[i + 1] = psms[i] + b[i];
        p2[i + 2] = p2[i] ^ b[i];
    }
    dp.assign(n, vector<unordered_map<int, int>>(2, unordered_map<int, int>()));
    /*
    for(int l = 0; l <= n; l += 1){
        for(int r = 0; r <= n; r += 1){
            for(int xr1 = 0; xr1 < 2; xr1 += 1){
                for(int xr2 = 0; xr2 < 2; xr2 += 1){
                    dp[l][r][xr1][xr2] = 0;
                }
            }
        }
        dp[l][l][1][0] = 1;
    }
    for(int l = n - 1; l >= 0; l -= 1){
        for(int r = l + 1; r <= n; r += 1){
            for(int xr1 = 0; xr1 < 2; xr1 += 1){
                for(int xr2 = 0; xr2 < 2; xr2 += 1){
                    dp[l][r][xr1][xr2] = 0;
                    if(dp[l + 1][r][xr2][xr1 ^ b[l]] == 0){
                        dp[l][r][xr1][xr2] = 1;
                    }
                    if(dp[l][r - 1][xr2][xr1^ b[r - 1]] == 0){
                        dp[l][r][xr1][xr2] = 1;
                    }
                }
            }
        }
    }
    if(dp[0][n][0][0]){
        return 0;
    }
    */
    if (get_dp(0, n, 0)) {
        return 0;
    }
    return 1;
}

int32_t main() {
    if (0) {
        n = 7;
        for (int mask = 0; mask < (1 << n); mask += 1) {
            a.resize(n);
            for (int i = 0; i < n; i += 1) {
                a[i] = ((mask >> i) & 1);
            }
            int rs = solve_slow();
            if (rs == 0) {
                for (int i = 0; i < n; i += 1) {
                    cout << a[i];
                }
                cout << " " << rs << "\n";
            }
        }
    }
    if (1) {
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
    }
    int T;
    cin >> T;
    while (T--) {
        cin >> n;
        a.resize(n);
        for (int i = 0; i < n; i += 1) {
            cin >> a[i];
        }
        int rs = solve_slow();
        if (rs == -1) {
            cout << "Draw"
                 << "\n";
        } else if (rs == 0) {
            cout << "First"
                 << "\n";
        } else {
            cout << "Second"
                 << "\n";
        }
    }
    return 0;
}

/*
2
5
1 1 0 0 1
5
1 0 0 1 1


*/

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 15
Accepted

Test #1:

score: 15
Accepted
time: 1ms
memory: 3544kb

input:

40
15
1042186166 1065050038 1052442342 117744385 1044381358 996146407 947617159 1031691934 27328777 130294601 1065311743 1065082111 12845136 941620871 1042177446
15
1068465534 15766217 69219008 95461385 1048542590 1051709438 1048575351 1072652151 978275647 1044381687 999247358 1062194999 1054829887 ...

output:

Second
Second
Second
First
First
Second
Second
Draw
Draw
Draw
Draw
Second
Second
Second
Second
First
First
Draw
Second
Second
Second
Draw
Second
Draw
Draw
First
Second
Second
Draw
Second
First
First
Second
Second
First
First
Second
First
First
Draw

result:

ok 40 tokens

Subtask #2:

score: 20
Accepted

Test #2:

score: 20
Accepted
time: 130ms
memory: 16260kb

input:

40
987
1073733087 9437225 570431533 1031755263 1031755251 579873284 571521061 536872960 546353705 43000364 535780827 1065313790 536834043 41953824 503270871 1040175099 8426021 537960961 1054732 545292837 34648585 34603052 546314244 537965060 9439748 41953292 43037189 9447949 536864767 1073698294 503...

output:

Second
Second
First
Second
First
Second
Second
First
Second
First
Draw
First
Second
First
First
Second
Second
Second
Draw
Draw
Draw
Draw
First
Second
Second
Second
Second
First
Second
Second
Draw
Second
First
Second
First
Draw
Second
First
First
First

result:

ok 40 tokens

Test #3:

score: 0
Accepted
time: 147ms
memory: 16100kb

input:

40
985
1051584087 161093905 991143886 498485632 221004168 788260831 916059871 274356401 213536945 95177001 98458032 869773278 787854966 1051043535 603582199 3672200 216942729 975171167 93067289 603832174 292948248 602275551 354556312 4589841 22567337 428083233 89540913 589692543 361906352 77353112 9...

output:

Second
First
Draw
Second
First
Second
Draw
First
First
Second
First
Draw
First
First
Draw
Second
First
Second
Second
Draw
First
First
First
Second
Second
Second
Draw
First
Second
Second
First
Second
First
Second
First
First
Second
First
First
First

result:

ok 40 tokens

Subtask #3:

score: 25
Accepted

Test #4:

score: 25
Accepted
time: 161ms
memory: 20072kb

input:

40
49999
30704571 23631198 10459697 452884 909025 3745220 5633170 29257098 24428644 21991837 21100897 21249665 18667093 13809790 21220831 32750672 29531337 31709216 17139349 4444339 787544 14509794 3855820 201034 13281440 26541636 31476242 10318360 20485824 26793325 8264891 22349828 20554718 7556006...

output:

Second
First
Second
Second
First
Second
Second
First
Second
Second
Second
First
First
First
Second
Second
Second
Second
First
First
Second
Second
Second
Second
First
First
Second
First
Second
First
First
First
First
Second
First
Second
First
First
First
First

result:

ok 40 tokens

Test #5:

score: 0
Accepted
time: 156ms
memory: 12576kb

input:

40
50000
32128601 23900639 9898059 10642201 2516432 19994626 8905808 23168114 27093651 32766595 7092623 14455293 32272254 11330578 25018676 9383756 16276912 15628227 6205425 11630483 19952395 19133325 22760569 7587885 30335157 13910732 11179526 4266775 18282905 14622912 11401940 33485172 9826535 292...

output:

First
Second
First
First
Second
Second
Second
Second
Second
First
Second
First
First
First
First
Second
First
Second
First
First
First
Second
First
First
First
Second
First
First
Second
Second
Second
First
First
First
First
First
First
Second
First
Second

result:

ok 40 tokens

Subtask #4:

score: 0
Memory Limit Exceeded

Test #6:

score: 0
Memory Limit Exceeded

input:

40
49035
1073176430 531291499 1005508607 675350672 368768 867368831 139504132 1321089 134482448 464248170 1068169195 68946580 469491567 738764816 742459920 535197167 531887598 672172545 609558673 608209040 335282031 532674543 72878741 610117777 138447508 398155759 71608464 672172165 402325355 609845...

output:


result: