来源:https://pintia.cn/problem-sets/994805342720868352/problems/994805348471259136
题解
满分版本
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
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,m,x;
scanf("%d %d",&n,&m);
set<node> s;
for(int i=1;i<=n;i++){
scanf("%d",&x);
if(i!=1){
printf("%d:",x);
int tempCnt=0;
for(auto it=s.begin();tempCnt<m&&it!=s.end();it++){
printf(" %d",it->value);
tempCnt++;
}
printf("\n");
}
auto it=s.find(node{x,book[x]});
if(it!=s.end()){
s.erase(it);
}
book[x]++;
s.insert(node{x,book[x]});
}
return 0;
}
超时版本
报错都是超时错误。50000的数据量,拷贝很多次会超时。
//16/25分
struct node{
int no,times=0;
};
bool cmp(node &a,node &b){
return a.times==b.times?a.no<b.no:a.times>b.times;
}
int main(){
int n,m,x;
scanf("%d %d",&n,&m);
vector<node> v(n+1);
for(int i=1;i<=n;i++){
scanf("%d",&x);
vector<node> vt(v);
sort(vt.begin(),vt.end(),cmp);
if(i!=1){
printf("%d:",x);
if(i<=m){
for(int j=0;j<i-1;j++){
printf(" %d",vt[j].no);
}
}else{
for(int j=0;j<m;j++){
printf(" %d",vt[j].no);
}
}
printf("\n");
}
v[x].no=x;
v[x].times++;
}
return 0;
}
本文提供了一道C++编程竞赛题目的详细解答,通过使用结构体和STL中的set容器,实现了一个高效的算法来处理大量数据的排序和查找操作。文章展示了如何在竞赛编程中运用高级数据结构和算法技巧,解决复杂的问题。
247

被折叠的 条评论
为什么被折叠?



