专栏文章
题解:P14256 平局(draw)
P14256题解参与者 3已保存评论 4
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @minkmu2w
- 此快照首次捕获于
- 2025/12/02 03:57 3 个月前
- 此快照最后确认于
- 2025/12/02 03:57 3 个月前
验题人题解。
以下讨论都在模 意义下进行。
约定石头为 ,剪刀为 ,布为 ,即 击败 。
两个观察:
-
如果出现两个相同的手势,则可以直接消去一个。
-
如果出现形如 的情况,则可以替换成一个 。证明考虑如果要让中间的 对答案有贡献,则左右两边的 必须损失一个,答案不会变大。
把这两种情况全部消去,剩下的数必定形如:
考虑在 前面有 项, 后面有 项,则答案为 ,容易手模出来。
现在我们再观察前面的两种情况,如果我们已经知道前 个人的 值,考虑下一个人:
- 相当于直接消去,对 无影响。
- 让 。
于是我们就可以直接 dp 了。设当前考虑到 ,第 个人的选择出 ,当前的 和 。考虑下一个人出 :
- :发生上面第一种情况,;
- :如果 ,则不会发生上面的第二种情况,;否则 。
- :。
每当发生消去时,答案要额外 ,记录方案数和当前的答案,即可做到 。注意到 不降,于是只用记录 即可,时间复杂度 。
代码
CPPconstexpr int N = 3005;
char s[N];
Mint f[N][3][N][3], g[N][3][N][3];
vi possible[N];
// signed main() {
int main() {
// freopen("draw3.in", "r", stdin);
// freopen(".out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
cin >> reinterpret_cast<char (&)[N]>(s[1]);
for (int i = 1; i <= n; i++) s[i] -= '0';
for (int i = 1; i <= n; i++) {
for (auto j : {0, 1, 2})
if (s[i] >> j & 1) possible[i].pb(j);
}
for (auto x : possible[1]) g[1][0][0][x] = 1;
for (int i = 1; i < n; i++) {
for (auto x : possible[i]) {
for (int upl = 0; upl < 3; upl++) {
for (int downl = 0; downl < i; downl++) {
auto &F = f[i][upl][downl][x], &G = g[i][upl][downl][x];
if (F != 0 || G != 0) {
for (auto nx : possible[i + 1]) {
if (x == nx) {
g[i + 1][upl][downl][nx] += G;
f[i + 1][upl][downl][nx] += F + G;
} else if ((x + 1) % 3 == nx) {
if (downl == 0) {
g[i + 1][(upl + 1) % 3][downl][nx] += G;
f[i + 1][(upl + 1) % 3][downl][nx] += F + G * (upl == 2);
} else {
g[i + 1][upl][downl - 1][nx] += G;
f[i + 1][upl][downl - 1][nx] += F + G;
}
} else {
g[i + 1][upl][downl + 1][nx] += G;
f[i + 1][upl][downl + 1][nx] += F;
}
}
}
}
}
}
}
Mint ans = 0;
for (auto x : possible[n]) {
for (int upl = 0; upl < 3; upl++) {
for (int downl = 0; downl < n; downl++) {
auto &F = f[n][upl][downl][x], &G = g[n][upl][downl][x];
ans += F + G * (downl / 3 + (upl == 2 && downl % 3 == 2));
}
}
}
cout << ans << endl;
return 0;
}
相关推荐
评论
共 4 条评论,欢迎与作者交流。
正在加载评论...