差一点就是差很多!

今天打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;
}
}
View Code

 

posted on 2021-05-16 19:41  小灰灰的父亲  阅读(38)  评论(0编辑  收藏  举报