#includeiostream #includestdio.h #includestdlib.h #includemath.h #includestring.h #includealgorithm #includemap #includevector #includequeue #includeset using namespace std ; //符号重载的node结构体作为set的元素自动排序,每次
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<set>
using namespace std;
//符号重载的node结构体作为set的元素自动排序,每次推荐set中的前k项
//book[num]标记num出现的次数
//注意先不处理输入的数字,根据之前的数据输出前K再存刚才新数据
int book[50001];
struct node{
int value,cnt;
bool operator<(const node &a)const{
return (cnt!=a.cnt)?cnt>a.cnt:value<a.value;
//第一优先级:频率降次 第二优先级:编号
}
};
int main(){
int n,k,num;
scanf("%d%d",&n,&k);//查询n次,每次推荐k个
set<node>s;
for(int i=0;i<n;i++){
scanf("%d",&num);
if(i!=0){
printf("%d:",num);
int tempCnt=0;
//tempCnt累计小于k
for(auto it=s.begin();tempCnt<k&&it!=s.end();it++){
printf(" %d",it->value);
tempCnt++;
}
printf("\n");
}
struct node a={num,book[num]};
auto it=s.find(a);//返回a在set中对应的指针
if(it!=s.end()) s.erase(it);
//如果a结构体存在就先删除
book[num]++;
struct node b={num,book[num]};
//重新插入新的num结构体
s.insert(b);
}
system("pause");
return 0;
}