思路:
对于所有的 黑的xi 若 满足 白的 xj≤xi 的 min(yj) 小于 yi 输出 No
对于所有的 黑的 yi 若 满足 白的 yj≤yi 的 min(xj) 小于 xi 输出 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
*/