QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#466179#8813. Records in Chichén ItzáHKOI0#WA 2ms9916kbC++175.4kb2024-07-07 16:45:462024-07-07 16:45:46

Judging History

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

  • [2024-07-07 16:45:46]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:9916kb
  • [2024-07-07 16:45:46]
  • 提交

answer

#include <bits/stdc++.h>
#define int long long
#define all(v) v.begin(), v.end()

using namespace std;
using ll = long long;
using pii = pair<int, int>;

const int N = (int) 5e5 + 11;
const int MOD = 998244353;
int p[N];

int sz[N], l[N], r[N];

int n; 
void add_edge(int child, int par, bool rev){
    printf("ADD EDGE %lld %lld %lld\n", child, par, (int) rev);
    if (rev) child = n + 1 - child, par = n + 1 - par;
    if (rev == 0) {
        l[par] = child;
    } else {
        r[par] = child;
    }
}

int pm(int a, int b){
    if (b == 0) return 1;
    return pm(a * a % MOD, b / 2) * (b % 2 ? a : 1) % MOD;
}

int dp[N][2][2];
int dp2[16];
void chadd(int& x, int y){
    x += y; x %= MOD;
}
void chsub(int& x, int y){
    x -= y; x %= MOD; x = (x + MOD) % MOD;
}

void test() {
    for (int msk = 0; msk < 64; msk++) {
        bool xl = false, xr = false, yl = false, yr = false;
        for (int i = 0; i < 6; i++) {
            if ((msk >> i) & 1) {
                int b = i % 2, c = i / 2;
                if (b == 0) xl = 1;
                if (b == 1) xr = 1;
                if (c == 0) yl = 1;
                if (c == 2) yr = 1;
            }
        }
        int val = 0;
        val = val * 2 + yr;
        
    }
}

void dfs(int v) {
#ifdef LOCAL
    printf("DFS %lld\n", v);
    printf("l[%lld] = %lld, r[%lld] = %lld\n", v, l[v], v, r[v]);
#endif
    sz[v] = 1;
    if (l[v]) {
        dfs(l[v]); sz[v] += sz[l[v]];
    }
    if (r[v]) {
        dfs(r[v]); sz[v] += sz[r[v]];
    }
    int sl = sz[l[v]], sr = sz[r[v]];
    for (int xl = 0; xl < 2; xl++) {
        for (int xr = 0; xr < 2; xr++) {
            for (int yl = 0; yl < 2; yl++) {
                for (int yr = 0; yr < 2; yr++) {
                    int p1 = dp[l[v]][xl][xr] * dp[r[v]][yl][yr] % MOD;
                    bool ok_l = sl == 0 || xr == 1, ok_r = sr == 0 || yl == 1;
                    for (int i = 0; i < 16; i++) {
                        int cl = 0, cr = 0;
                        if (sl == 0) {
                            if ((i & 3) == 3) cl = 1;
                            else cl = 0;
                        } else {
                            cl += sl - 1;
                            if (i & 1) cl++;
                            if (i & 2) cl++;
                        }
                        if (sr == 0) {
                            if ((i & 12) == 12) cr = 1;
                            else cr = 0;
                        } else {
                            cr += sr - 1;
                            if (i & 4) cr++;
                            if (i & 8) cr++;
                        }
                        dp2[i] = pm(2, cl * cr);
                    }
                    cout << "Vertex = " << v << endl;
                    cout << "Lch = " << sl << ' ' << "Rch = " << sr << endl;
                    for (int i = 0; i < 16; i++) {
                        cout << dp2[i] << ' ';
                    }
                    cout << endl;
                    for (int x = 1; x < 16; x *= 2) {
                        for (int y = 0; y < 16; y += x * 2) {
                            for (int c = 0; c < x; c++) {
                                chsub(dp2[y + x + c], dp2[y + c]);
                            }
                        }
                    }
                    cout << "Vertex = " << v << endl;
                    for (int i = 0; i < 16; i++) {
                        cout << dp2[i] << ' ';
                    }
                    cout << endl;
                    for (int i = 0; i < 16; i++) {
                        if (!ok_l && !(i & 1)) continue;
                        if (!ok_r && !(i & 4)) continue;
                        int zl = (i & 2) > 0, zr = (i & 8) > 0;
                        chadd(dp[v][zl][zr], p1 * dp2[i] % MOD);
                    }
                }
            }
        }
    }
}

void solve() {
    dp[0][0][0] = 1;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> p[i];
    }
    vector<int> v;
    for (int i = 1; i <= n; i++) {
        if (v.empty()) {
            v.push_back(i);
        } else {
            while (v.size() >= 2 && p[v[(int) v.size() - 2]] < p[i]) {
                v.pop_back();
            }
            assert(v.size());
            if (p[v.back()] < p[i]) {
                add_edge(v.back(), i, false);
                v.pop_back();
            }
            v.push_back(i);
        }
    }
    v.clear();
    reverse(p + 1, p + n + 1);
    for (int i = 1; i <= n; i++) {
        if (v.empty()) {
            v.push_back(i);
        } else {
            while (v.size() >= 2 && p[v[(int) v.size() - 2]] < p[i]) {
                v.pop_back();
            }
            assert(v.size());
            if (p[v.back()] < p[i]) {
                add_edge(v.back(), i, true);
                v.pop_back();
            }
            v.push_back(i);
        }
    }
    v.clear();
    reverse(p + 1, p + n + 1);

    int rt = max_element(p + 1, p + n + 1) - p;
    dfs(rt);

    int ans = 0;
    for (int x = 0; x < 2; x++) {
        for (int y = 0; y < 2; y++) {
            chadd(ans, dp[rt][x][y]);
        }
    }
    cout << ans << '\n';
}

signed main() {
#ifndef LOCAL
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
#endif
    int T = 1;
    // cin >> T;
    while (T--) solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 2ms
memory: 9916kb

input:

3
6
1 1 1 1 3 3
5
1 1 2 2 2
10
1 1 1 1 2 2 2 2 3 3

output:

Vertex = 3
Lch = 0 Rch = 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 
Vertex = 3
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 
Vertex = 3
Lch = 0 Rch = 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 
Vertex = 3
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 
Vertex = 3
Lch = 0 Rch = 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 
Vertex = 3
1 0 0 0 0 0 0 0 0 0 0...

result:

wrong answer 1st words differ - expected: 'No', found: 'Vertex'