这题是stl的综合应用,map要想快,直接上unordered_map,这样查询接近O(1),是不是很嗨皮。

思路其实还是很简单的,type+id做个Hash,由于set.insert的第一个返回值是指向该插入元素的迭代器,所以,对于每一个type+id我们都可以存下它对应的迭代器,这样删除不就很快了吗,省去查找。

这题是我第一次用c++11的语法, 原谅我的low,嘻嘻,auto还挺好用。

#include <bits/stdc++.h>
using namespace std; const long long BASE=1e10; struct Pair {
long long score,hash_val;
Pair(long long s,long long h) {
score=s;
hash_val=h;
}
bool operator < (const Pair &b) const {
if (score!=b.score) {
return score>b.score;
}
long long id1=hash_val%BASE,id2=b.hash_val%BASE;
long long type1=hash_val-id1,type2=b.hash_val-id2;
if (type1!=type2) {
return type1<type2;
}
return id1<id2;
}
}; set<Pair> s;
// set<pair<long long,long long> > del;
//unordered_map<long long,long long>mp;
unordered_map<long long,set<Pair>::iterator >mp;
long long num[55],top[55],total,totaltop;
vector<long long> ans[55];
long long M,N; long long Hash(long long type,long long id)
{
return type*BASE+id;
} void select()
{
memset(num,0,sizeof(num));
long long cnt=0;
// for (set<Pair>:: iterator it=s.begin();it!=s.end()&&cnt<total;it++) {
// long long id=it->hash_val%BASE,type=it->hash_val/BASE;
//
//// printf("SELECT: \n");
//// printf("type: %I64d id: %I64d\n",type,id);
// if (num[type]<top[type]) {
// cnt++;
// num[type]++;
// ans[type].push_back(id);
//// printf("IN:\n");
//// printf("type: %I64d id: %I64d\n",type,id);
// }
// else continue;
// } for (auto it:s) {
long long id=it.hash_val%BASE,type=it.hash_val/BASE;
if (num[type]<top[type]) {
num[type]++;
cnt++;
ans[type].push_back(id);
}
if (cnt==total||cnt==totaltop) break;
}
// printf("ANS:\n");
// for (int i=0;i<M;i++) {
// for (int j=0;j<ans[i].size();j++) {
// printf("%I64d ",ans[i][j]);
// }
// puts("");
// }
// puts("");
} void print() {
for (set<Pair>::iterator it=s.begin();it!=s.end();it++) {
printf("sc:%I64d type:%I64d id:%I64d\n",it->score,it->hash_val/BASE,it->hash_val%BASE);
}
puts("");
} int main()
{
// long long hash_val=Hash(12,23);
// printf("%I64d %I64d\n",hash_val%BASE,hash_val-hash_val%BASE);
//
// s.insert(Pair(5,Hash(2,1)));
// s.insert(Pair(5,Hash(2,2)));
// s.insert(Pair(6,Hash(7,2)));
// mp[Hash(1,1)]=s.insert(Pair(5,Hash(1,1))).first;
// s.erase(mp[Hash(1,1)]);
// for (set<Pair>::iterator it=s.begin();it!=s.end();it++) {
// printf("%lld %lld %lld\n",it->score,it->hash_val%BASE,it->hash_val-it->hash_val%BASE);
// }
freopen("in.txt","r",stdin);
long long sc,id,opnum,op,type,comm;
scanf("%I64d%I64d",&M,&N);
for (int i=0;i<N;i++) {
scanf("%I64d%I64d",&id,&sc);
for (int j=0;j<M;j++) {
mp[Hash(j,id)]=s.insert(Pair(sc,Hash(j,id))).first;
}
}
// print();
scanf("%I64d",&opnum);
for (int i=0;i<opnum;i++) {
scanf("%I64d",&op);
if (op==1) {
scanf("%I64d%I64d%I64d",&type,&comm,&sc);
mp[Hash(type,comm)]=s.insert(Pair(sc,Hash(type,comm))).first;
// print();
}
else if (op==2) {
scanf("%I64d%I64d",&type,&comm);
s.erase(mp[Hash(type,comm)]);
// print();
}
else {
scanf("%I64d",&total);
totaltop=0;
for (int j=0;j<M;j++) {
scanf("%I64d",&top[j]);
totaltop+=top[j];
ans[j].clear();
}
// print();
select();
for (int j=0;j<M;j++) {
if (ans[j].size()==0) {
printf("-1\n");
}
else {
int anssize=ans[j].size();
// for (int k=0;k<anssize;k++){
// printf("%I64d",ans[j][k]);
// if (k==anssize-1) putchar('\n');
// else putchar(' ');
// }
for (int i=0;i<anssize;i++) {
printf("%I64d",ans[j][i]);
if (i==anssize-1) {
putchar('\n'); }
else {
putchar(' ');
}
}
}
ans[j].clear();
}
}
}
return 0;
}

CCF 试题编号: 201909-4 试题名称: 推荐系统的更多相关文章

  1. 试题编号: 201903-3 试题名称: 损坏的RAID5

    这题的数据未免也太水了,题目的意思好像默认是每块磁盘装载数据的长度是相等的.我写了判断每次取数据是否会超过每块磁盘存的数据的长度,然而并没有什么卵用.交上去20分,写了个数据测了下,如果要求的块太大的 ...

  2. Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)

    Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流) Description 问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同 ...

  3. 震惊!几道Python 理论面试题,Python面试题No18

    本面试题题库,由公号:非本科程序员 整理发布 第1题: 简述解释型和编译型编程语言? 解释型语言编写的程序不需要编译,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候 ...

  4. 面试前赶紧看了5道Python Web面试题,Python面试题No17

    目录 本面试题题库,由公号:非本科程序员 整理发布 第1题: Flask中的请求上下文和应用上下文是什么? 第2题:django中间件的使用? 第3题: django开发中数据做过什么优化? 第4题: ...

  5. 千万不要错过这几道Python面试题,Python面试题No16

    第1题: python下多线程的限制以及多进程中传递参数的方式? python多线程有个全局解释器锁(global interpreter lock),简称GIL,这个GIL并不是python的特性, ...

  6. CSP 试题编号201803-2 Java实现

    package HB; import java.util.Scanner; public class Test_06 { public static void main(String[] args) ...

  7. CSP 试题编号201803-1 Java实现

    import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner input ...

  8. Python面试题之Python面试题汇总

    在这篇文章中: Python基础篇 1:为什么学习Python 2:通过什么途径学习Python 3:谈谈对Python和其他语言的区别 Python的优势: 4:简述解释型和编译型编程语言 5:Py ...

  9. 微软BI SSIS 2012 ETL 控件与案例精讲面试 200 问(SSIS 面试题,ETL 面试题)

    开篇介绍 本自测与面试题出自 微软BI SSIS 2012 ETL 控件与案例精讲 (http://www.hellobi.com/course/21) 课程,对于学完本课程的每一课时和阅读完相关辅助 ...

随机推荐

  1. 服务器上搭建使用SSH账户登录的Git仓库

    1.安装git yum install -y git 2.创建git仓库保存的目录 mkdir /data/git_repo 3.初始化空仓库 cd /data/git_repogit init -- ...

  2. centost redhat 卸载rpm以及yum install 的正确姿势

    先看yum  install 的卸载: 第一列为我们要的包名: 那么要移除必须使用 yum list |grep  collectd | awk '{print $1}' |xargs  yum  r ...

  3. 关于真机测试root权限问题

    普通用户好像也无伤大雅: 输入后看到这样的有个美元符号,说明你的虚拟机获取不了权限,有权限的应该是root和#都有,这个时候你输入su 如果还是没有变化,看看你的虚拟机是不是android7.0,An ...

  4. CentOS7.5升级OpenSSH

    实验环境 OS:CentOS 7.5 当前openssh版本:OpenSSH_7.4p1 升级后的openssh版本:OpenSSH_8.0p1 开通telnet 为了防止升级过程中ssh断连,保险起 ...

  5. c++踩坑大法好 宏定义 头文件

    1,c++宏定义是干啥的?防止重复引用,如何防止重复引用? //a.h //声明一个类,和其他声明 #include <iostream> class A{ public: static ...

  6. jquery easyui combogrid Uncaught TypeError:Cannot read property

    ================================ ©Copyright 蕃薯耀 2020-01-07 https://www.cnblogs.com/fanshuyao/ 一.问题描述 ...

  7. Java-类的生命周期浅析

    简述:Java虚拟机为Java程序提供运行时环境,其中一项重要的任务就是管理类和对象的生命周期.类的生命周期.类的生命周期从类被加载.连接和初始化开始,到类被卸载结束.当类处于生命周期中时,它的二级制 ...

  8. HTML的列表标签和表格标签

    网页的列表和表格 列表的分类 无序列表 有序列表 自定义列表 有序列表 <!--有序列表--><ol>    <li>辽宁</li>    <li ...

  9. 实现排行榜神器——redis zset

    需求:假如现在需要搞个 “运动消耗卡路里排行榜”,例似微信步数排名,显示排名前20人的信息和消耗的卡里路,怎样实现排序? 一般思路:存储信息,然后数据库查询,排序?(假如有几十万人参与排名,这样查my ...

  10. webpack4.41.0配置二(加载器_url-loader/babel-loader/sass-loader)

    loader是webpack用来预处理源文件的,比如typesrcipt形式的文件最终都得转成浏览器可以执行的js文件 (注:以下的配置代码不一定与下方一摸一样,具体与官网上https://webpa ...