处理第一部分对撞的时候,复杂度不是n方吗(,为啥不会超时(遍历套了一个erase),代码处有注释
#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<unordered_map>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<queue>
#include<deque>
#include<set>
using namespace std;
int _;
#define endl '\n'
#define p 1e9+7
//#define int long long
void solve(){
map<int,int> mp;
int n,m;cin>>n>>m;//0-12
vector<int> a(n+1);
for(int i=1;i<=n;++i) cin>>a[i];
vector<int> r_odd;
vector<int> l_odd;
vector<int> r_even;
vector<int> l_even;
for(int i=1;i<=n;++i){
char s;cin>>s;
if(s=='L'&&a[i]%2) l_odd.push_back(a[i]);
if(s=='L'&&!(a[i]%2)) l_even.push_back(a[i]);
if(s=='R'&&a[i]%2) r_odd.push_back(a[i]);
if(s=='R'&&!(a[i]%2)) r_even.push_back(a[i]);
mp[a[i]]=i;
}
vector<int> ans(n+1,-1);//实时记录答案
sort(l_odd.begin(),l_odd.end());
sort(r_odd.begin(),r_odd.end());
sort(l_even.begin(),l_even.end());
sort(r_even.begin(),r_even.end());
// for(int i=1;i<=n;++i) cout<<ans[i]<<' ';
// cout<<endl;
//对撞 这里erase可能会超时
for(int i=r_odd.size()-1;i>=0;--i){
auto it=upper_bound(l_odd.begin(),l_odd.end(),r_odd[i]);
if(it!=l_odd.end()){
ans[mp[*it]]=ans[mp[r_odd[i]]]=abs(*it-r_odd[i])/2;
l_odd.erase(it);
r_odd.erase(r_odd.begin()+i);
//cout<<1<<endl;
}
}
for(int i=r_even.size()-1;i>=0;--i){
auto it=upper_bound(l_even.begin(),l_even.end(),r_even[i]);
if(it!=l_even.end()){
ans[mp[*it]]=ans[mp[r_even[i]]]=abs(*it-r_even[i])/2;
l_even.erase(it);
r_even.erase(r_even.begin()+i);
}
}
// for(int i=1;i<=n;++i) cout<<ans[i]<<' ';
// cout<<endl;
//顺向
for(int i=r_even.size()-1;i>=0;i-=2){
if(r_even.size()<2) break;
ans[mp[r_even[i]]]=ans[mp[r_even[i-1]]]=m-r_even[i]+(r_even[i]-r_even[i-1])/2;
r_even.pop_back();
r_even.pop_back();
}
for(int i=r_odd.size()-1;i>=0;i-=2){
if(r_odd.size()<2) break;
ans[mp[r_odd[i]]]=ans[mp[r_odd[i-1]]]=m-r_odd[i]+(r_odd[i]-r_odd[i-1])/2;
r_odd.pop_back();
r_odd.pop_back();
}
//for(int i=1;i<=n;++i) cout<<ans[i]<<' ';
//cout<<endl;
for(int i=0;i<l_even.size();i+=2){
if(l_even.size()-i<=1) break;
ans[mp[l_even[i]]]=ans[mp[l_even[i+1]]]=l_even[i]+(l_even[i+1]-l_even[i])/2;
}
//for(int i=1;i<=n;++i) cout<<ans[i]<<' ';
//cout<<endl;
for(int i=0;i<l_odd.size();i+=2){
if(l_odd.size()-i<=1) break;
ans[mp[l_odd[i]]]=ans[mp[l_odd[i+1]]]=l_odd[i]+(l_odd[i+1]-l_odd[i])/2;
}
//cout<<l_odd.size()<<endl;
for(int i=l_odd.size()-1;i>=0;i--){
if(ans[mp[l_odd[i]]]!=-1) l_odd.erase(l_odd.begin()+i);
//cout<<l_odd[i]<<endl;
//cout<<mp[l_odd[i]]<<endl;
//cout<<ans[mp[l_odd[i]]]<<endl;
}
//cout<<l_odd.size()<<endl;
for(int i=l_even.size()-1;i>=0;i--){
if(ans[mp[l_even[i]]]!=-1) l_even.erase(l_even.begin()+i);
}
//for(int i=1;i<=n;++i) cout<<ans[i]<<' ';
//cout<<endl;
//反向中的反向
//cout<<l_odd.size()<<endl;
for(int i=0;i<l_odd.size();++i){
//cout<<1<<endl;
if(!r_odd.size()) break;
int len=(2*m-abs(r_odd.back()-l_odd[i]))/2;
ans[mp[r_odd.back()]]=ans[mp[l_odd[i]]]=len;
r_odd.pop_back();
}
for(int i=0;i<l_even.size();++i){
if(!r_even.size()) break;
int len=(2*m-abs(r_even.back()-l_even[i]))/2;
ans[mp[r_even.back()]]=ans[mp[l_even[i]]]=len;
r_even.pop_back();
}
for(int i=1;i<=n;++i) cout<<ans[i]<<' ';
cout<<endl;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>_;
while(_--){
solve();
}
return 0;
}