思路:
括号匹配好题
1.能碰撞的两个点坐标的奇偶性一定相同
2.一般的,当所有的点不需要经过撞墙反弹后才能碰撞时,坐标奇偶性相同的点碰撞的过程就是一个括号匹配进栈出栈的过程,向右走的点进栈遇到向左走的点就出栈。
3.一轮括号匹配结束后剩下的点只要左括号变右括号、右括号变左括号然后继续匹配。处理一般情况的时候多余的右括号先不动,多余的左括号变成右括号。因为撞了一次墙,所以左括号变右括号时需要挪到最左边。
MyCode:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e5 + 7, maxm = 4e5 + 7;
struct node{
int id,idx;
char dis;
bool operator<(const node& a)const{
return idx<a.idx;
}
}q[maxn];
int ans[maxn];
signed main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int _,n,m;
cin>>_;
vector<deque<pair<int,int>>>cur(2);
while(_--) {
cin>>n>>m;
for(int i=1;i<=n;++i) {
cin>>q[i].idx;
q[i].id=i;
ans[i]=-1;
}
for(int i=1;i<=n;++i) cin>>q[i].dis;
sort(q+1,q+1+n);
for(int i=1,id,idx;i<=n;++i) {
idx=q[i].idx,id=q[i].id;
if(q[i].dis=='R') cur[idx%2].emplace_back(make_pair(id,idx));
else {
if(cur[idx%2].size()) {
int y=cur[idx%2].back().first,idy=cur[idx%2].back().second;
cur[idx%2].pop_back();
// cout<<idx<<' '<<idy<<' '<<abs(idx-idy)/2<<'\n';
ans[id]=ans[y]=abs(idx-idy)/2;
}
else cur[idx%2].emplace_front(make_pair(id,-idx));
}
}
for(int i=0;i<2;++i) {
int x,y,xx,yy;
while(cur[i].size()>=2) {
x=cur[i].back().first,xx=cur[i].back().second; cur[i].pop_back();
y=cur[i].back().first,yy=cur[i].back().second; cur[i].pop_back();
ans[x]=ans[y]=m-xx+(xx-yy)/2;
}
cur[i].clear();
}
for(int i=1;i<=n;++i) cout<<ans[i]<<' ';
cout<<'\n';
}
return 0;
} 
京公网安备 11010502036488号