本蒟蒻的代码QAQ
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long l;
l a[505][505], ax[] = {0, -1, 1, 0, 0}, ay[] = {0, 0, 0, 1, -1}, n, m, cnt = 0, al[505][505], ar[505][505];
l vis[505][505];
void dfs(l x, l y)
{
if (vis[x][y]) return;
vis[x][y] = 1;
for (l i = 1; i <= 4; ++i)
{
l tx = x + ax[i], ty = y + ay[i];
if (tx > 0 && tx <= n && ty > 0 && ty <= m && a[tx][ty] > a[x][y])
{
dfs(tx, ty);
al[x][y] = min(al[tx][ty], al[x][y]);
ar[x][y] = max(ar[tx][ty], ar[x][y]);
}
}
}
int main()
{
scanf("%lld%lld", &n, &m);
memset(vis, 0, sizeof(vis));
memset(al, 0x3f, sizeof(al));
memset(ar, 0, sizeof(ar));
for (l i = 1; i <= n; ++i)
{
for (l j = 1; j <= m; ++j)
{
scanf("%lld", &a[i][j]);
}
}
for (int i = 1; i <= m; i++)
{
al[n][i] = ar[n][i] = i;
}
for (l i = 1; i <= m; ++i)
{
dfs(n, i);
}
for (l i = 1; i <= m; ++i)
{
cnt += vis[n][i];
}
if (cnt < m)
{
printf("0\n%lld", cnt);
return 0;
}
l left = 1;
cnt = 0;
while (left <= m)
{
l maxr = 0;
for (l i = 1; i <= m; ++i)
{
if (al[1][i] <= left) maxr = max(maxr, ar[1][i]);
}
cnt++;
left = maxr + 1;
}
printf("1\n%lld", cnt);
return 0;
}
悬赏关注