[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;
}