codeforces1154E. Two Teams

题目传送门 ( ̄︶ ̄)↗ 走你

有两个教练,每次都从队伍中选取最大的人,及其附近的k个人,选中的人离队,反复进行直到所有人都被选完,求每个人被选到了哪个教练手里。


双向链表模拟


#include <stdio.h>
#include <stdlib.h>
#include <climits>
#include <cstring>
#include <time.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <utility>
#include <vector>
#include <string>

#define INF 0x3f3f3f3f
#define ll long long
#define Pair pair<int,int>
#define re return

#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;
const int maxn=2e5+5;
struct Node{
    int val,ind;
    Node* pre;
    Node* next;
    Node(){}
    Node(int v,int i,Node* p):val(v),ind(i),pre(p),next(NULL){}
};

int N,k;
Node* Rank[maxn];
bool vis[maxn];
int ans[maxn];
Node head;
inline void Del(Node* pos);
int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin>>N>>k;
    int num;
    Node* pos=&head;
    rep(i,1,N+1){
        cin>>num;
        pos->next=new Node(num,i,pos);
        pos=pos->next;
        Rank[pos->val]=pos;
    }


    int flag=0;
    Node* starPos;
    Node* temp;
    drep(i,N,1){
        if(vis[i])
            continue;
        vis[i]=true;

        starPos=Rank[i];
        ans[starPos->ind]=flag%2;

        //straight forward
        pos=starPos->next;
        int t=0;
        while(pos && t<k){
            vis[pos->val]=true;
            ans[pos->ind]=flag%2;
             t++;
             
            Del(pos);
            pos=pos->next;
        }

        //back forward
        pos=starPos->pre;
        t=0;
        while(pos!= (&head) && t<k){
            vis[pos->val]=true;
            ans[pos->ind]=flag%2;
            t++;

            pos=pos->pre;
            Del(pos->next);
        }
        Del(starPos);

        flag++;
    }

    rep(i,1,N+1)
        cout<<ans[i]+1;
    cout<<"\n";

    re 0;
}
inline void Del(Node* pos){
    Node* pre=pos->pre;
    Node* next=pos->next;
    pre->next=next;
    if(next)
        next->pre=pre;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值