QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#466179 | #8813. Records in Chichén Itzá | HKOI0# | WA | 2ms | 9916kb | C++17 | 5.4kb | 2024-07-07 16:45:46 | 2024-07-07 16:45:46 |
Judging History
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'