csp201909-4推荐系统 C++ 使用set + unordered_map

本文介绍了一道CSP比赛题目,涉及C++实现的商品推荐系统。通过重载结构体的比较操作符使用set进行排序。为解决删除操作导致的超时问题,采用unordered_map存储键值对,以O(1)时间复杂度找到待删除元素的迭代器,再以O(logn)复杂度删除,从而优化整体性能。
摘要由CSDN通过智能技术生成

题目
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解题思路
题目很简单,模拟一个商品存储就行了,重载结构体的<符号,就可以使用STL中的set进行自动排序。
但是直接这样写只能得10分,显示超时。
从数据量大小来看,查询语句有1e5个,其中ask只有100个,所以主要得操作还是增和删。
set的增是O(logn),应该没问题,现在问题是删除时候,需要先遍历整个set找到需要删除的元素,这样的话复杂度就是O(n)了,这样的话如果有1e5个删除操作,所有商品数量级1e5时候,复杂度就是1e10级别了,肯定是超时的,所有必须把删除操作的复杂度降低为O(logn)。
引入unordered_map<long long ,set<GOODS>::iterator>,前面是type+id组成的键,后面是对应set的迭代器。实现删除的时候在O(1)复杂度上找到该迭代器再以O(logn)的复杂度删除。
具体操作看代码。

代码

#include <iostream>
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);

using namespace std;

struct GOODS   //商品
{
   
    int type;
    int id;
    int score;
    GOODS (int t,int i,int s)
    {
   
        type = t; id = i; score = s;
    }
    GOODS ()
    {
   
        type = -1; id = -1; score = -1;
    }
    bool operator< (const GOODS& b) const   //重载< 用于set(set自动排序)
    {
   
        if( score == b.score )
        {
   
            if(type == b.type)
            {
   
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值