重载运算符,set有自动排序功能,还能log级别查找出来删除更新
#include<bits/stdc++.h>
#define FI first
#define SE second
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = 1e5 + 7;
const int INF = 0x7f7f7f7f;
int n, k, x;
map<int, int> mp;
struct node {
int u, cnt;
bool operator < (const node &a) const {
if(a.cnt == cnt){
return a.u > u;
}
return a.cnt < cnt;
}
};
set<node> st;
int main() {
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; ++i) {
scanf("%d", &x);
if(st.size()) {
printf("%d:", x);
set<node>::iterator t = st.begin();
for(int j = 1; j <= k && t != st.end(); ++j, ++t) {
printf(" %d", (*t).u);
}
printf("\n");
}
if(mp[x]) {
set<node>::iterator t = st.find(node{x, mp[x]});
st.erase(t);
mp[x]++;
st.insert(node{x, mp[x]});
}
else {
mp[x]++;
st.insert(node{x, 1});
}
}
return 0;
}