题目大意

给你 n(2n2×105)n(2\le n\le 2\times 10^5) 个,第 ii 个点在第 xix_i 行从 yiy_i 开始向 sis_i 一直移动,判断是否会有点在运动时与其他点重合。

思路

因为每一个点只会在 yiy_i 行移动,所以每一行都是单独的,可以分开讨论。

yiy_i 行的所有的 xix_isis_i 放到一个数组里,接着将他们按照 xix_i 排序。

对于每一行,一次遍历所有的元素,如果比遍历到一个 xix_isis_iR\texttt{R} 那么记录下来。

接下来如果看到 sis_iL\texttt{L} 那么就输出 Yes\texttt{Yes} 并结束程序。

AC Code

#include<bits/stdc++.h>
#define int long long 
#define x first 
#define y second
using namespace std;
const int N=2e5+5;
int n,y[N],x[N];
map<int,vector<pair<int,char> > >a;
//将一个整数映射到一个长度可变的类型是 int 和 char 的数组
map<int,bool> vis;
//将一个 int 映射到 bool 变量
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
    //关闭输入输出流,但是就只能用 cin 与 cout
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x[i]>>y[i];
	}
	for(int i=1;i<=n;i++){
		char ch;
		cin>>ch;
		a[y[i]].push_back({x[i],ch});
	}
	for(int i=1;i<=n;i++){
		if(vis.count(y[i])){ //处理过这一行了
			continue;
		}
		vis[y[i]]=1;
		sort(a[y[i]].begin(),a[y[i]].end()); //将这个数组按照从小到大排序
		bool flag=0;
		for(auto v:a[y[i]]){
			if(v.y=='R'){
				flag=1;
			}
			else{
				if(flag){
					cout<<"Yes\n";
					return 0;
				}
			}
		}
	}
	cout<<"No\n";
	return 0;
}