[ABC311] D~G 题解
[ABC311] D~G 题解
D - Grid Ice Floor 搜索
题目的意思实际上是要求出所有可能到达的点,也就是说所有路径可达点的并。
基本上看清题目就会了,直接搜索每个点,每次枚举四个方向的时候直接冲到底,需要用数组去重贡献。
void dfs(int x, int y, int fax, int fay) {
if(st[x][y]) return ;
st[x][y] = 1;
for(int i = 0; i < 4; i ++) {
int cnt = 0;
int xx = x + dx[i], yy = y + dy[i];
while(check(xx, yy)) {
ans += !vis[xx][yy], vis[xx][yy] = 1;
xx += dx[i], yy += dy[i];
}
xx -= dx[i], yy -= dy[i];
dfs(xx, yy, x, y);
}
}
signed main() {
memset(dist, 0, sizeof dist);
vis[2][2] = 1;
dist[2][2] = 1;
dfs(2, 2, 0, 0);
cout << ans << '\n';
return 0;
}
E - Defect-free Squares
使用
F - Yet Another Grid Task
使用
这样会爆,考虑优化状态表示。
观察发现,如果一个位置是黑色的,那么它所在列下面的所有的格子都是黑的,所以只需要保留一个最上的黑格子位置即可,有了这个观察,得到表示:
由于第
如果令
发现可以前缀和优化掉,滚掉一维,剩下没了。
时间复杂度:
#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int N = 2e3 + 10, mod = 998244353;
int n, m, top[N];
long long dp[N], s[N][N];
char g[N][N];
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> g[i][j], (g[i][j] == '#' ? top[j] = max(top[j], n - i + 1) : 0);
for (int i = 0; i <= n; i++)
s[0][i] = 1;
for (int i = 1; i <= m; i++)
for (int j = top[i]; j <= n; j++)
dp[j] = s[i - 1][min(j + 1, n)] - s[i - 1][max(top[i - 1] - 1, 0)],
s[i][j] = ((j ? s[i][j - 1] : 0) + dp[j]) % mod;
cout << s[m][n] << '\n';
return 0;
}
G - One More Grid Task
观察到
时间复杂度:
#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int N = 3e2 + 10, M = 3e2;
int n, m, l[N][N], r[N][N], u[N][N];
int g[N][N];
long long s[N][N];
bool st[N];
long long sum(int a, int b, int c, int d)
{
if (c < a || d < b)
return 0;
return s[c][d] - s[a - 1][d] - s[c][b - 1] + s[a - 1][b - 1];
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> g[i][j], s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + g[i][j], st[g[i][j]] = 1;
long long ans = 0;
for (int k = 1; k <= M; k++)
{
if (!st[k])
continue; // 小优化
memset(u, 0, sizeof u);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
if (g[i][j] < k)
g[i][j] = 0;
l[i][j] = r[i][j] = j;
}
for (int i = 1; i <= n; i++)
{
for (int j = 2; j <= m; j++)
if (g[i][j] && g[i][j - 1])
l[i][j] = l[i][j - 1];
for (int j = m - 1; j; j--)
if (g[i][j] && g[i][j + 1])
r[i][j] = r[i][j + 1];
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (!g[i][j])
continue;
if (g[i - 1][j])
l[i][j] = max(l[i][j], l[i - 1][j]), r[i][j] = min(r[i][j], r[i - 1][j]);
u[i][j] = u[i - 1][j] + 1;
ans = max(ans, 1ll * k * sum(i - u[i][j] + 1, l[i][j], i, r[i][j]));
}
}
}
cout << ans << '\n';
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App