题目传送门 ( ̄︶ ̄)↗ 走你
有两个教练,每次都从队伍中选取最大的人,及其附近的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;
}