题解 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;
}
不要妄图追上西坠的太阳,而是要在黎明前就等着它!