题解 CF1154E 【Two Teams】

\[\huge\mathcal{Description} \]

日期 2020年8月31日
编号 \(\texttt{CF1154E}\)
算法 优先队列模拟暴力枚举
来源 无名小题

\[\huge\mathcal{Solution} \]

这道题目我们可以按照题目大意模拟
利用优先队列,我们每次可以弹出最大的,然后把他左左右右\(k\)个人以及他都设为本队的。
注意,左右是每边各\(k\)个人哦。
当然,被选中后就不能再选,所以我们要做一下处理。
这道题目\(CF\)难度有\(1800\)
我不信

\[\huge\mathcal{Code} \]

#include<bits/stdc++.h>
using namespace std;
struct Struct
{
	int Id;
	int Value;
	int Ans;
	int Left;
	int Right;
	inline bool operator < (const Struct &Compare)const
	{
		return Value<Compare.Value;
	}
};
int Total,Ks;
Struct Array[200001];
priority_queue< Struct >Queue;
int main(void)
{
	register int i,j;
	cin>>Total>>Ks;
	for(i=1;i<=Total;i++)
	{
		cin>>Array[i].Value;
		Array[i].Id=i;
		Array[i].Left=i-1;
		Array[i].Right=i+1;
		Queue.push(Array[i]);
	}
	Array[Total].Right=0;
	register int Team;
	Team=1;
	while(!Queue.empty())
	{
		while(!Queue.empty()&&Array[Queue.top().Id].Ans)
		{
			Queue.pop();
		}
		if(!Queue.empty())
		{
			register Struct Now;
			Now=Queue.top();
			Array[Now.Id].Ans=Team;
			register int Count;
			Count=0;
			i=Array[Now.Id].Left;
			while(Count<Ks&&i)
			{
				Count++;
				Array[i].Ans=Team;
				i=Array[i].Left;
			}
			Count=0;
			j=Array[Now.Id].Right;
			while(Count<Ks&&j)
			{
				Count++;
				Array[j].Ans=Team;
				j=Array[j].Right;
			}
			Array[i].Right=j;
			Array[j].Left=i;
			Team=3-Team;
		}
	}
	for(i=1;i<=Total;i++)
	{
		cout<<Array[i].Ans;
	}
	cout<<endl;
	return 0;
}
posted @ 2020-08-31 21:10  Bushuai_Tang  阅读(169)  评论(0编辑  收藏  举报