/*
题意:n个机器人,有的往左走有的往右走,
同一时间在同一个整数点的机器人爆炸,
碰到墙改变方向
题解:
1.按位置排序
2.分奇数偶数讨论,因为奇数和偶数之间不会爆炸
3.如果一个向左的机器人,在左端没有其他相同奇偶性的点存在的情况下必然与右端相撞
4.左扫一次右扫一次
p.s. 学会
int i=vc.back() 最后一个元素
vc.pop_back() 弹出最后一个元素
*/
#include<bits/stdc++.h>
using namespace std;
#define x first.first
#define y first.second
#define z second
int T,n,m;
char c;
int main(){
cin>>T;
while(T--){
cin>>n>>m;
vector<pair<pair<int,int>,int>>a(n);
for(int i=0;i<n;i++){
cin>>a[i].x;
}
for(int i=0;i<n;i++){
cin>>c;
a[i].y=(c=='L'? -1:1);
a[i].z=i;
}
sort(a.begin(),a.end());
vector<int>ans(n,-1);
vector<vector<int>>p(2);
for(int i=0;i<n;i++){
int r=a[i].x%2;
if(a[i].y==-1){
if(p[r].empty()){
p[r].push_back(i);
}
else {
int j=p[r].back();
p[r].pop_back();
ans[a[i].z] = ans[a[j].z] = (a[i].x - (a[j].y == 1 ? a[j].x : -a[j].x)) / 2;
}
}else{
p[r].push_back(i);
}
}
for(int r=0;r<2;r++){
while(p[r].size()>1){
int i=p[r].back();
p[r].pop_back();
int j=p[r].back();
p[r].pop_back();
ans[a[i].z]=ans[a[j].z]=(2*m-a[i].x-(a[j].y==1?a[j].x:-a[j].x))/2;
}
}
for(int i=0;i<n;i++){
cout<<ans[i]<<' ';
}
cout<<endl;
}
}
1525C - Robot Collisions
最新推荐文章于 2021-05-19 22:44:31 发布