https://codeforces.com/contest/1525/problem/C
思路:
奇数位置和偶数位置的小机器人分别会碰撞.
先排序。
因为向左跑的小机器人必然会和它前面第一个向右跑的合法机器人相撞,所以类似括号匹配把往右边跑的先扔进栈里,然后和当前遍历的L机器人算。当栈顶是L 时候也可以算。最后算完就是LRRR/RRR这样的情况
感觉银川回来的状态不对写题脑袋都不对劲了
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<stack>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=3e5+1000;
typedef long long LL;
inline LL read(){LL x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
struct Robot{
LL id,pos;char dir;LL add=0;
}robot[maxn];
LL ans[maxn];
stack<Robot>s1,s2;///往右走的机器人:奇位,偶位
bool cmp(Robot A,Robot B){ return A.pos<B.pos; }
void init(){
while(!s1.empty()) s1.pop();
while(!s2.empty()) s2.pop();
}
int main(void){
cin.tie(0);std::ios::sync_with_stdio(false);
LL t;cin>>t;
while(t--){
init();
LL n,m;cin>>n>>m;
for(LL i=0;i<=n+10;i++) robot[i].id=robot[i].pos=robot[i].dir=0;
for(LL i=1;i<=n;i++) { robot[i].id=i;cin>>robot[i].pos; }
for(LL i=1;i<=n;i++) cin>>robot[i].dir;
for(LL i=1;i<=n;i++) ans[i]=-1;
sort(robot+1,robot+1+n,cmp);
for(LL i=1;i<=n;i++){
if(robot[i].dir=='L'){
if(robot[i].pos&1){///当前机器人为奇数位置
if(s1.empty()){
s1.push(robot[i]);
}
else{
Robot A=s1.top();s1.pop();
Robot B=robot[i];
LL times=0;
if(A.dir=='L'){
times=(A.pos+B.pos)/2;
}
else{
times=(B.pos-A.pos)/2;
}
// if(A.dir!=B.dir){
// times=abs(A.pos-B.pos)/2;
// }
// else{
// times=A.pos+abs(A.pos-B.pos)/2;
// }
ans[A.id]=ans[B.id]=times;
}
}
else{///当前机器人为偶数位置
if(s2.empty()){
s2.push(robot[i]);
}
else{
Robot A=s2.top();s2.pop();
Robot B=robot[i];
LL times=0;
if(A.dir=='L'){
times=(A.pos+B.pos)/2;
}
else{
times=(B.pos-A.pos)/2;
}
// if(A.dir!=B.dir){
// times=abs(A.pos-B.pos)/2;
// }
// else{
// times=A.pos+abs(A.pos-B.pos)/2;
// }
ans[A.id]=ans[B.id]=times;
}
}
}
else{///向右跑的
if(robot[i].pos&1) s1.push(robot[i]);
else s2.push(robot[i]);
}
}
while(s1.size()>=2){
Robot A=s1.top();s1.pop();
Robot B=s1.top();s1.pop();
LL times=0;
if(B.dir=='L'){
times=(2*m+B.pos-A.pos)/2;
}
else{
times=(2*m-A.pos-B.pos)/2;
}
ans[A.id]=ans[B.id]=times;
}
while(s2.size()>=2){
Robot A=s2.top();s2.pop();
Robot B=s2.top();s2.pop();
LL times=0;
if(B.dir=='L'){
times=(2*m+B.pos-A.pos)/2;
}
else{
times=(2*m-A.pos-B.pos)/2;
}
ans[A.id]=ans[B.id]=times;
}
for(LL i=1;i<=n;i++){
cout<<ans[i]<<" ";
}cout<<"\n";
}
return 0;
}