P8865 [NOIP2022] 种花
P8865 NOIP2022 种花 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)。
记
考虑对每个点统计:左上角在该点的
那么接下来我们想:对于一个点怎么计算对应的答案?我们生成一个地图来看看:
其中白色代表可以放置花,红色代表不可放置。现在,我们要计算左上角在
较容易看出,
考虑
据此,我们考虑预处理
那么
- 当
的一竖延伸到 时,剩下一部分有 种画法; - 当
的一竖延伸到 时,剩下一部分有 种画法; - 当
的一竖延伸到 时,剩下一部分有 种画法; - 当
的一竖延伸到 时,剩下一部分有 种画法。
因此剩下这部分总共有
一般地,
这里
为了让式子仍然可以
这样以来,当
接下来计算
剩下一部分因为形状的变化,画法数量也会有变化。当
类似一般地,
预处理
这样以来,当
时间复杂度
/*
* @Author: crab-in-the-northeast
* @Date: 2022-12-01 11:11:02
* @Last Modified by: crab-in-the-northeast
* @Last Modified time: 2022-12-01 12:02:12
*/
#include <bits/stdc++.h>
#define int long long
inline int read() {
int x = 0;
bool f = true;
char ch = getchar();
for (; !isdigit(ch); ch = getchar())
if (ch == '-')
f = false;
for (; isdigit(ch); ch = getchar())
x = (x << 1) + (x << 3) + ch - '0';
return f ? x : (~(x - 1));
}
inline std :: pair <std :: string, int> rest(bool space = true) {
std :: string s;
char ch = getchar();
for (; !isgraph(ch); ch = getchar());
for (; isgraph(ch); ch = getchar())
s.push_back(ch);
return {space ? " " + s : s, s.length()};
}
const int maxn = 1005;
const int maxm = 1005;
const int mod = 998244353;
bool a[maxn][maxm];
int r[maxn][maxm], g[maxn][maxm], h[maxn][maxm];
signed main() {
int T = read(); read();
while (T--) {
std :: memset(r, -1, sizeof(r));
std :: memset(g, 0, sizeof(g));
std :: memset(h, 0, sizeof(h));
int n = read(), m = read(), C = read(), F = read();
for (int i = 1; i <= n; ++i) {
std :: string s = rest().first;
for (int j = 1; j <= m; ++j)
a[i][j] = (s[j] == '1');
}
for (int i = 1; i <= n; ++i)
for (int j = m; j; --j)
r[i][j] = a[i][j] ? -1 : (r[i][j + 1] + 1);
for (int i = n; i; --i)
for (int j = 1; j <= m; ++j)
g[i][j] = a[i][j] ? 0 : ((g[i + 1][j] + r[i][j]) % mod);
for (int j = 1; j <= m; ++j) {
for (int i = n, k = n; i; --i) {
if (a[i][j])
k = i - 1;
else
h[i][j] = (h[i + 1][j] + r[i][j] * (k - i)) % mod;
}
}
int c = 0, f = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (a[i][j] || a[i + 1][j])
continue;
(c += r[i][j] * g[i + 2][j]) %= mod;
(f += r[i][j] * h[i + 2][j]) %= mod;
}
}
printf("%lld %lld\n", c * C, f * F);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效