HOW D
  • 板块灌水区
  • 楼主DoubleQLzn
  • 当前回复2
  • 已保存回复3
  • 发布时间2024/12/28 21:44
  • 上次更新2024/12/29 10:35:21
查看原帖
HOW D
953149
DoubleQLzn楼主2024/12/28 21:44

思路:

对于所有的 黑的xix_i 若 满足 白的 xjxix_j\le x_imin(yj)\min(y_j) 小于 yiy_i 输出 No

对于所有的 黑的 yiy_i 若 满足 白的 yjyiy_j\le y_imin(xj)\min(x_j) 小于 xix_i 输出 No

AC 53 WA 10

#include <bits/stdc++.h>
using namespace std;
#define int long long
map<int,int> hang,lie;
int x[200005],y[200005];
char c[200005];
int a[200005],b[200005],d[200005],e[200005];
int k = 0,t;
int f1(int i)
{
	int k = upper_bound(a + 1,a + t + 1,i) - a - 1;
	if (k < 0 || k > t) return 1e10;
	return b[k];
}
int f2(int i)
{
	int k = upper_bound(d + 1,d + t + 1,i) - d - 1;
	if (k < 0 || k > t) return 1e10;
	return e[k];
}
signed main()
{
	int n,m;
	cin >> n >> m;
	for (int i = 1;i <= m;i++)
	{
		cin >> x[i] >> y[i] >> c[i];
		if (c[i] == 'W')
		{
			++t;
			if (!hang.count(x[i])) hang[x[i]] = y[i];
			else hang[x[i]] = min(hang[x[i]],y[i]);
			if (!lie.count(y[i])) lie[y[i]] = x[i];
			else lie[y[i]] = min(lie[y[i]],x[i]);
		}
	}
	int k = 0;
	for (auto s : hang)
	{
		k++;
		a[k] = s.first;
		b[k] = s.second; 
		if (k >= t)
		{
			break;
		}
	}
	b[0] = 1e10;
	for (int i = 1;i <= t;i++) b[i] = min(b[i],b[i - 1]);
	k = 0;
	for (auto s : lie)
	{
		++k;
		d[k] = s.first;
		e[k] = s.second;
		if (k >= t)
		{
			break;
		}
	}
	e[0] = 1e10;
	for (int i = 1;i <= t;i++) e[i] = min(e[i],e[i - 1]);
//	for(int i=1;i<=k;i++)cout<<a[i]<<' '<<b[i]<<' '<<d[i]<<' '<<e[i]<<endl;
	for (int i = 1;i <= m;i++)
	{
		if (c[i] == 'B')
		{
			//cout<<x[i]<<' '<<f1(x[i])<<' '<<y[i]<<' '<<f2(y[i])<<endl;
			if (f1(x[i]) < y[i])
			{
				cout << "No";
				return 0;
			}
			if (f2(y[i]) < x[i])
			{
				cout << "No";
				return 0;
			}
		}
	} 
	cout << "Yes";
	return 0;
}
/*
	W比他小的x_i中min y_i
	W比它小的y_i中min x_i
*/
2024/12/28 21:44
加载中...