Gym 2019 Sichuan Province Programming Contest A. Autochess(线段树+STL瞎搞)

GYM 同时被 2 个专栏收录
9 篇文章 0 订阅
50 篇文章 0 订阅

 

 

const int N=1e5+5;

    int n,m,_;
    int i,j,k;
    //int a[N];
    map<string,vector<int>> mp;
    vector<string> ans;
    int len;
    struct Node
    {
        int l,r;
        int sum;
        #define lson id<<1
        #define rson id<<1|1
    }t[N<<2];

void build(int l,int r,int id)
{
    t[id].sum=0;
    t[id].l=l,t[id].r=r;
    if(l==r) return ;
    else{
        int mid=l+r>>1;
        build(l,mid,lson);
        build(mid+1,r,rson);
    }
}

void push_up(int id)
{
    t[id].sum=t[lson].sum+t[rson].sum;
}

void update(int id,int pos,int c)
{
    int l=t[id].l,r=t[id].r;
    if(l==r) t[id].sum=c;
    else{
        int mid=l+r>>1;
        if(mid>=pos) update(lson,pos,c);
        else update(rson,pos,c);
        push_up(id);
    }
}

int query(int id)
{
    int l=t[id].l,r=t[id].r;
    if(l==r) return l;
    else{
        int mid=l+r>>1;
        if(t[lson].sum==mid-l+1) return query(rson);
        else return query(lson);
    }
}

int main()
{
    int num=0;
    IOS;
    rush(){
        cin>>n>>m>>k;
        len=0;
        mp.clear();
        ans.resize(m+1);
        build(1,m,1);
        for(int w=1;w<=n;w++){
            string s;
            cin>>s;
            if(len==m && mp[s].size()!=k-1) continue;
            if(mp.count(s+"3")) continue;
            int sz=mp[s].size(),pos;
            if(sz==k-1){
                //mp
                //线段树
                //len
                for(int i=0;i<sz;i++){
                    pos=mp[s][i];
                    update(1,pos,0);
                    len--;
                }
                mp.erase(mp.find(s));

                pos=query(1);
                sz=mp[s+"2"].size();
                if(sz==k-1){ 
                    for(int i=0;i<sz;i++){
                        pos=mp[s+"2"][i];
                        update(1,pos,0);
                        len--;
                    }
                    mp.erase(mp.find(s+"2"));

                    pos=query(1);
                    update(1,pos,1);
                    mp[s+"3"].pb(pos);
                    len++;
                } else mp[s+"2"].pb(pos),update(1,pos,1),len++;
            } else{
                pos=query(1);
                update(1,pos,1);
                mp[s].pb(pos);
                len++;
            }
        }
        cout<<"Case "<<++num<<":";
        for(map<string,vector<int>>::iterator it=mp.begin();it!=mp.end();it++){
            int sz=(it->second).size();
            string s=it->first;
            for(int i=0;i<sz;i++) ans[mp[s][i]]=s;
        }
        for(int i=1;i<=m;i++){
            if(ans[i].size()) cout<<" "<<ans[i];
            else cout<<" "<<-1;
        }
        cout<<endl;
        ans.clear();
    }
    //PAUSE;
    return 0;
}

 

  • 3
    点赞
  • 2
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值