AcWing 3280. 推荐系统
原题链接
中等
作者:
追着你行走
,
2021-04-03 17:07:18
,
所有人可见
,
阅读 751
论优先队列,队列,哈希的作用
代码实现
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5,M=51;
struct node{
int id,score,type;
friend bool operator < (node a,node b ){
if(a.score==b.score) {
if(a.type==b.type) return a.id>b.id;
else return a.type>b.type;
}
return a.score<b.score; //todo update
}
};
priority_queue<node> q;
queue<node> qq;
unordered_map<int,int> del[M];
int num[M],n,m;
vector<int> res[M];
int main(){
ios::sync_with_stdio(false); cin.tie(0);cout.tie(0);
cin>>m>>n;
for(int i=1;i<=n;i++) {
int id,s; cin>>id>>s;
for(int j=0;j<m;j++) {
q.push({id,s,j});
}
}
int t; cin>>t;
while(t--) {
int op; cin>>op;
if(op==1||op==2) {
int type,id,s;
cin>>type>>id;
if(op==1) {
cin>>s;
q.push({id,s,type});
} else del[type][id]=1; // 延迟删除
} else {
int k; cin>>k;
for(int i=0;i<m;i++) {
cin>>num[i];//每个类别的数量
res[i].clear();
}
//qq=queue<node> () ;
while(q.size()&&k) {
node x=q.top(); q.pop();
if(del[x.type][x.id]==1) {
del[x.type][x.id]=0;
continue;
}
else {
if(num[x.type]) { //还可以优化
res[x.type].push_back(x.id) ;
k--,num[x.type]--;
}
}
qq.push(x); //不可用or可用,都可加入
}
while(qq.size() ) {
node x=qq.front(); qq.pop();
q.push(x);
}
//print
for(int i=0;i<m;i++) {
if(res[i].size())
for(auto it:res[i]) cout<<it<<' ';
else cout<<-1;
cout<<'\n';
}
}
}
return 0;
}
这个目前好像会报错了,因为数据里出现了预先删除还没添加的商品的情况…所以需要在新增商品的时候判断更新一下对应的
del
的值