D - Draw Your Cards(模拟)

Posted Harris-H

tags:

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

D - Draw Your Cards(模拟)

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

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

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

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

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

#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