题目链接:https://atcoder.jp/contests/abc386/tasks/abc386_d
题意:
给你一个表格,表格上已经填充了一些黑块和白块,让你判断能否涂色至黑块总是在白块的左上角
思路:
每个点离散化,按行为第一关键字,列为第二关键字排序。即从上至下找到白块便记录其最小的y,后来的黑块在这个白块后面或者下面(因为白块和黑块都经过排序),判断后来的黑块y是不是大于或等于此时白块最小的y
#include<bits/stdc++.h>
using namespace std;
const int maxn =2e5+5;
struct point{int x,y;char c;
}a[maxn];
int n;
int m;
bool cmp(point a,point b)
{if(a.x!=b.x)return a.x<b.x;return a.y<b.y;
}
signed main()
{ios::sync_with_stdio(false),cin.tie(0);cin>>n>>m;for(int i=0;i<m;i++){cin>>a[i].x>>a[i].y>>a[i].c;}sort(a,a+m,cmp);int wy=n+1;bool f=true;for(int i=0;i<m;i++){if(a[i].c=='W')wy=min(wy,a[i].y);else{if(a[i].y>=wy){f=false;}}}if(f)cout<<"Yes";else cout<<"No";return 0;
}