1154E

\数据结构
开一个vector 记录人员编号及能力值并sort,另开一数组jud标记人员是否还在队列

用链表模拟人员的删除,(下方代码用了数组。。)
第一次wa:用数组模拟链表时ab.next错写成ab+1;
第二次wa:P1和p2指针在每次删减人后停留的位置;
第三次wa:p1和P2互相赋值时未考虑变化;
反思:直接用库里的list。。。。。
``
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX=2e5+10;
typedef struct {
int v;
int next,pre;
// int jud;

} pe;
/bool operator <(const pe &a,const pe &b){
return a.jud>b.jud||a.jud==b.jud&&a.v<b.v;
}
/
pair<int,int> pa[MAX];
pe ab[MAX];
int visit[MAX];
int teamm[MAX];
int main() {

int n,k,maxx=0;
int maxab;

cin>>n>>k;
for(int i=1; i<=n; i++) {
	cin>>ab[i].v;
	pa[i].first=ab[i].v;
	pa[i].second=i;
	ab[i].next=i+1;
	ab[i].pre=i-1;

}
int sump=0;
int n1=n;
sort(pa+1,pa+n+1);

int team=0,p1,p2;

for(maxab=pa[n1].second; n1>0; n1--,maxab=pa[n1].second) {

	sump=0;
	if(visit[maxab]==1)continue;
	p1=ab[maxab].pre;
	p2=ab[maxab].next;

	for(int j=ab[maxab].next; sump!=k; sump++) {
		if(j==n+1)break;

		teamm[j]=team;

		visit[j]=1;



		j=ab[j].next;
		p2=j;
	}

	sump=0;

	for(int j=ab[maxab].pre; sump!=k ; sump++) {

		if(j==0)break;

		teamm[j]=team;

		visit[j]=1;



		j=ab[j].pre;
		p1=j;
	}


	teamm[maxab]=team;

	ab[p1].next=p2;
	ab[p2].pre=p1;
	team=(team+1)%2;

}

for(int i=1; i<=n; i++) {

	cout<<teamm[i]+1;
}

}
``

猜你喜欢

转载自blog.csdn.net/weixin_43845768/article/details/89421020
今日推荐