[ABC243C] Collision 2 的题解

题目大意

给你 \(n(2\le n\le 2\times 10^5)\) 个,第 \(i\) 个点在第 \(x_i\) 行从 \(y_i\) 开始向 \(s_i\) 一直移动,判断是否会有点在运动时与其他点重合。

思路

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

\(y_i\) 行的所有的 \(x_i\)\(s_i\) 放到一个数组里,接着将他们按照 \(x_i\) 排序。

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

接下来如果看到 \(s_i\)\(\texttt{L}\) 那么就输出 \(\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;
}
posted @ 2024-07-14 13:42  未抑郁的刘大狗  阅读(12)  评论(0编辑  收藏  举报