| 记录编号 |
611267 |
评测结果 |
AAAAAAAAAAAAAAAA |
| 题目名称 |
[THUPC 2025 pre] 乒乓球赛 |
最终得分 |
100 |
| 用户昵称 |
LikableP |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
1.279 s |
| 提交时间 |
2026-01-24 19:24:41 |
内存使用 |
1.62 MiB |
显示代码纯文本
#include <cstdio>
#include <cassert>
#include <algorithm>
const int MOD = 998244353;
static void solve(int n) {
int _f[30], _f_last[30];
int _g[30];
int *f = _f + 15, *f_last = _f_last + 15;
int *g = _g + 15;
for (int i = -12; i <= 12; i++) {
f[i] = 0;
g[i] = 1;
}
f[0] = 1;
for (int i = 1; i <= n; i++) {
int a, b;
assert(2 == scanf("%d%d", &a, &b));
if (!(a == -1 && b == -1)) {
assert(0 <= a && a <= n);
assert(0 <= b && b <= n);
}
std::swap(f, f_last);
for (int j = -12; j <= 12; j++) {
f[j] = 0;
f_last[j] = f_last[j] * g[j];
g[j] = 1;
}
int L, R;
if (i <= 11) {
L = -i;
R = i;
} else if (i <= 21) {
L = -11 + (i - 11);
R = 11 - (i - 11);
} else {
L = -2;
R = 2;
}
for (int j = L; j <= R; j++) {
f[j] = (f_last[j - 1] + f_last[j + 1]) % MOD;
}
if (i <= 20) {
if ((i - L) / 2 == 11) {
g[L] = 0;
}
if ((i + R) / 2 == 11) {
g[R] = 0;
}
} else if (i % 2 == 0) {
g[-2] = g[2] = 0;
}
if (a != -1) {
int d = a - b;
if (a + b != i) {
d = 233;
}
for (int j = L; j <= R; j++) {
f[j] = j == d || j == -d ? f[j] : 0;
}
}
}
int sum = 0;
for (int i = -11; i <= 11; i++) {
sum = (sum + f[i] * (1 - g[i])) % MOD;
}
printf("%d\n", sum);
}
int main() {
freopen("thupc_2025_pre_pingpong.in", "r", stdin);
freopen("thupc_2025_pre_pingpong.out", "w", stdout);
int T;
assert(1 == scanf("%d", &T));
assert(1 <= T && T <= 100000);
int sum_n = 0;
while (T--) {
int n;
assert(1 == scanf("%d", &n));
assert(1 <= n && n <= 100000);
sum_n += n;
assert(sum_n <= 500000);
solve(n);
}
}