D - Draw Your Cards(模拟)

Posted Herio

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D - Draw Your Cards(模拟)相关的知识,希望对你有一定的参考价值。


D - Draw Your Cards(模拟)

用一个set维护当前所有堆对应的堆顶数。

每次lowerbound找,如果有则用链表插到表头。开一个数组记录cnt。

如果cnt=k,则遍历更新答案,然后从set里删掉堆顶。

每个元素最多遍历一次删除一次。

时间复杂度:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,k,ans[N],cnt[N],to[N];
set<int>s;
int main()

scanf("%d%d",&n,&k);
memset(ans,-1,sizeof(ans));
for(int i=1,x;i<=n;i++)

scanf("%d",&x);
auto it=s.lower_bound(x);
if(it==s.end())s.insert(x),cnt[x]=1;
else cnt[x]=cnt[*it]+1,to[x]=*it,s.erase(it),s.insert(x);
if(cnt[x]==k)

for(int j=x;j;j=to[j])ans[j]=i;
s.erase(s.find(x));


for(int i=1;i<=n;i++)printf("%d\\n",ans[i]);
return 0;


以上是关于D - Draw Your Cards(模拟)的主要内容,如果未能解决你的问题,请参考以下文章

D - Draw Your Cards(模拟)

Draw your Next App Idea with Ink to Code

UVA - 10935:Throwing cards away I (简单模拟)

UVA - 10935:Throwing cards away I (简单模拟)

紫书第五章训练3 D - Throwing cards away I

题解 CF546C Soldier and Cards