比赛 |
2025暑期集训第8场 |
评测结果 |
AAAAAAAAAA |
题目名称 |
引水入城 |
最终得分 |
100 |
用户昵称 |
hsl_beat |
运行时间 |
0.264 s |
代码语言 |
C++ |
内存使用 |
24.21 MiB |
提交时间 |
2025-08-13 11:18:23 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, m, h[1111][1111];
int a[1111][1111], b[1111][1111];
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
bool vis[1111][1111];
pair<int, int> c[1111];
void dfs(int x, int y)
{
if (vis[x][y]) {
return;
}
vis[x][y] = 1;
for (int i = 0; i < 4; ++i) {
int dx = x + dir[i][0];
int dy = y + dir[i][1];
if (dx >= 1 && dx <= n && dy >= 1 && dy <= m && h[dx][dy] < h[x][y]) {
if (!vis[dx][dy]) {
dfs(dx, dy);
}
a[x][y] = min(a[dx][dy], a[x][y]);
b[x][y] = max(b[dx][dy], b[x][y]);
}
}
}
signed main()
{
freopen("flow.in", "r", stdin);
freopen("flow.out", "w", stdout);
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 >> h[i][j];
}
}
memset(a, 0x3f3f3f3f, sizeof(a));
memset(b, -1, sizeof(b));
for (int i = 1; i <= m; ++i) {
a[n][i] = i;
b[n][i] = i;
}
for (int i = 1; i <= m; ++i) {
if (!vis[1][i]) {
dfs(1, i);
}
}
for (int i = 1; i <= m; ++i) {
c[i].first = a[1][i];
c[i].second = b[1][i];
}
int r = m, ans = 0, l = 1;
sort(c + 1, c + m + 1);
bool ok = 1;
for (int i = 1, j = 1; i <= m; ++i) {
int tp = LLONG_MIN;
while (j <= m && c[j].first <= l) {
tp = max(c[j].second, tp);
++j;
}
if (tp >= r) {
cout << 1 << '\n';
cout << ans + 1 << '\n';
return 0;
}
if (tp < l) {
ans = -1;
break;
}
l = tp + 1;
ans++;
i = j - 1;
}
int cnt = 0;
for (int i = 1; i <= m; ++i) {
cnt += vis[n][i];
}
cout << 0 << '\n';
cout << m - cnt << '\n';
return 0;
}