无语,线段覆盖不会写
查看原帖
无语,线段覆盖不会写
1122193
FarmerDrone楼主2024/8/4 11:51

我都跟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;
}
2024/8/4 11:51
加载中...