题目
解题思路
题目很简单,模拟一个商品存储就行了,重载结构体的<符号,就可以使用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)
{