我都跟20年J1写的一样了但全T。别的应该没问题。不能达成的部分AC。
#include <bits/stdc++.h>
using namespace std;
class sgm
{
public:
int l;
int r;
inline friend bool operator < (sgm a, sgm b)
{
return a.l != b.l ? a.l < b.l : a.r < b.r;
}
} s[505];
int main()
{
int x[4] = {0, 0, 1, -1};
int y[4] = {1, -1, 0, 0};
int n, m;
cin >> n >> m;
int a[510][510];
memset(a, 63, sizeof(a));
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];
bool bl[510][510];
bool blm[510][510];
memset(blm, 0, sizeof(blm));
queue <pair <int, int> > q;
for (int k = 1; k <= m; k++)
{
memset(bl, 0, sizeof(bl));
bl[1][k] = 1;
while (! q.empty())
q.pop();
q.push(make_pair(1, k));
while (! q.empty())
{
pair <int, int> p = q.front();
if (p.first == n)
blm[k][p.second] = 1;
q.pop();
for (int i = 0; i < 4; i++)
if (! bl[p.first + x[i]][p.second + y[i]] && a[p.first][p.second] > a[p.first + x[i]][p.second + y[i]])
{
bl[p.first + x[i]][p.second + y[i]] = 1;
q.push(make_pair(p.first + x[i], p.second + y[i]));
}
}
}
bool f;
int cnt = 0;
for (int i = 1; i <= m; i++)
{
f = 0;
for (int j = 1; j <= m; j++)
f |= blm[j][i];
cnt += !f;
}
if (cnt)
{
cout << "0\n";
cout << cnt << endl;
return 0;
}
cout << "1\n";
int l, r;
bool fl, fr;
for (int i = 1; i <= m; i++)
{
r = m;
fl = fr = 0;
for (int j = 1; j <= m; j++)
{
if (blm[i][j] && ! fl)
l = j,
fl = 1;
if (! blm[i][j] && fl && ! fr)
r = j - 1,
fr = 1;
}
if (fl)
s[cnt].l = l,
s[cnt++].r = r;
}
//就是这边
sort(s, s + cnt);
int p = 1;
for (int i = 1; i < cnt; i++)
{
if (s[i].r > s[p - 1].r)
s[p++] = s[i];
}
r = 0;
int ans = 0;
int p2 = 0;
while (r < m)
{
while (p2 + 1 < p && s[p2 + 1].l <= r)
p2++;
r = max(r, s[p2].r);
ans++;
}
cout << ans << endl;
return 0;
}