差一点就是差很多!
今天打cf感觉不是很认真,而且做完两题之后就跟榜走,看D,能感觉出D是个dp,但是就是没思路,看了好久,又回头做C,第一遍写完只有两分钟了,而且我还有一个小地方写错了(两个变量位置不对),但是已经没办法改了,所以就感觉做的很不好
C题从第一个开始走,如果是想左的就看前面有没有没消去的,有就消去,没有就存起来,向右的就存起来,然后再看最终还有多少存着的,从后向前遍历,每两个是一对,最后有剩的话就是-1
#include<bits/stdc++.h> using namespace std; #define LL long long #define pb push_back struct mp { int id; int wei; char fang; mp(int a,int b,char c) { id=a;wei=b;fang=c; } mp(){} }; bool cmp(mp p1,mp p2) { return p1.wei<p2.wei; } int vis[300005]; int main() { int t; cin>>t; while(t--) { int n,m; cin>>n>>m; for(int i=0;i<n;i++)vis[i]=-1; vector<mp>pp(n); vector<mp>p; vector<mp>q; p.clear();q.clear(); for(int i=0;i<n;i++) { int v;cin>>v; pp[i].id=i; pp[i].wei=v; } for(int i=0;i<n;i++) { char v;cin>>v; pp[i].fang=v; }sort(pp.begin(),pp.end(),cmp); for(int i=0;i<n;i++) { if(pp[i].wei%2==0) { p.pb(pp[i]); } else q.pb(pp[i]); } vector<mp>res;res.clear(); for(int i=0;i<p.size();i++) { if(res.size()==0)res.pb(p[i]); else if(p[i].fang=='L') { if(res[res.size()-1].fang=='R'){ vis[res[res.size()-1].id]=vis[p[i].id]=(p[i].wei-res[res.size()-1].wei)/2; res.pop_back(); } else { vis[res[res.size()-1].id]=vis[p[i].id]=(p[i].wei+res[res.size()-1].wei)/2; res.pop_back(); } } else { res.pb(p[i]); } } while(1) { if(res.size()==1) { vis[res[0].id]=-1; } if(res.size()==0||res.size()==1)break; mp z1=res[res.size()-1]; res.pop_back(); mp z2=res[res.size()-1]; res.pop_back(); if(z2.fang=='L') { vis[z1.id]=vis[z2.id]=(m+z2.wei+m-z1.wei)/2; } else{ vis[z1.id]=vis[z2.id]=(m-z1.wei+m-z2.wei)/2; } } res.clear(); for(int i=0;i<q.size();i++) { if(res.size()==0)res.pb(q[i]); else if(q[i].fang=='L') { if(res[res.size()-1].fang=='R'){ vis[res[res.size()-1].id]=vis[q[i].id]=(q[i].wei-res[res.size()-1].wei)/2; res.pop_back(); } else { vis[res[res.size()-1].id]=vis[q[i].id]=(q[i].wei+res[res.size()-1].wei)/2; res.pop_back(); } } else { res.pb(q[i]); } } while(1) { if(res.size()==1) { vis[res[0].id]=-1; } if(res.size()==0||res.size()==1)break; mp z1=res[res.size()-1]; res.pop_back(); mp z2=res[res.size()-1]; res.pop_back(); if(z2.fang=='L') { vis[z1.id]=vis[z2.id]=(m+z2.wei+m-z1.wei)/2; } else{ vis[z1.id]=vis[z2.id]=(m-z1.wei+m-z2.wei)/2; } } for(int i=0;i<n;i++) { cout<<vis[i]<<" "; } cout<<endl; } }