玄关求助哪错了
  • 板块灌水区
  • 楼主Lian_zy
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/12/28 22:04
  • 上次更新2024/12/29 11:22:21
查看原帖
玄关求助哪错了
923248
Lian_zy楼主2024/12/28 22:04

rt,思路已确认没问题

#include<bits/stdc++.h>
#define N 1000005
using namespace std;

//如果有一个已经染色的黑点在一个白点右下方,则不合法 
struct node{
	int x,y;
	char c;
}a[N],q[N];
map<int,int>mp;
int n,m,cnt,maxi,lsh[N];
bool cmp(node x,node y){
	return x.c<y.c;
}
bool cmp2(node x,node y){
	if(x.x==y.x)return x.y<y.y;
	return x.x<y.x;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>a[i].x>>a[i].y>>a[i].c;
		lsh[++cnt]=a[i].x;
		lsh[++cnt]=a[i].y;
	}
	sort(lsh+1,lsh+cnt+1);
	cnt=unique(lsh+1,lsh+cnt+1)-(lsh+1);
	for(int i=1;i<=cnt;i++)mp[lsh[i]]=i;
	for(int i=1;i<=m;i++){
		a[i].x=mp[a[i].x];
		a[i].y=mp[a[i].y];
		maxi=max(a[i].x,max(a[i].y,maxi));
	}
	sort(a+1,a+m+1,cmp);
	cnt=0;
	int flag=-1;
	for(int i=1;i<=m;i++){
		if(a[i].c=='B'){
			q[++cnt]=a[i];
		}else{
			flag=i;
			break;
		}
	}
	if(flag==-1){
		puts("Yes");
		return 0;
	}
	sort(q+1,q+cnt+1,cmp2);
	for(int i=flag;i<=m;i++){
		int l=1,r=cnt;
		int ansl=-1;
		while(l<=r){
			int mid=l+r>>1;
			if(q[mid].x>=a[i].x){
				ansl=mid;
				r=mid-1;
			}else l=mid+1;
		}
		if(ansl==-1){
			continue;
		}
		int ans=-1;
		l=ansl,r=cnt;
		while(l<=r){
			int mid=l+r>>1;
			if(q[mid].y>=a[i].y){
				ans=1;
				break;
			}else l=mid+1;
		}
		if(~ans){
			puts("No");
			return 0;
		}
	}
	puts("Yes");
	return 0;
}
2024/12/28 22:04
加载中...