点击前往试题目录:https://blog.csdn.net/best335/article/details/99550556
题意:
有m∈[0,49]类商品,每类商品有n∈[0,30000]个物品. 初始时,给出第i>m>>n;//初始化商品
for(int i=0,id,score;i>id>>score;
for(int j=0;j>op;//增删查操作
for(int i=0,k,kind,type,commodity,score,K[51];i>kind;
switch(kind){
case 1://增加
cin>>type>>commodity>>score;
G[type][commodity]=score;//在G中记录该Type类编号为Commodity商品成绩映射
F[score].insert(pair(type,commodity));//在F中插入该商品
break;
case 2://删除
cin>>type>>commodity;
if((itG=G[type].find(commodity))!=G[type].end()){//如果该商品存在则开始删除
itF=F.find(itG->second);//首先查找该商品在F中找到所有Score为itG->second的所有商品
itF->second.erase(pair(type,commodity));//删除该商品
if(itF->second.empty())F.erase(itF);//如果该分数的容器为空 删掉
G[type].erase(itG);//删掉Type类的Commodity到Score的映射
}
break;
case 3://查询
cin>>k;//查询总个数k
for(int j=0;j>K[j];//输入每类不得超过的最大查询数
set S[51];//存储所有类查询到的商品编号
for(auto it=F.rbegin();it!=F.rend()&&k>0;++it){//按分数由大到小选择前k个物品
set&s=it->second;//该分数下所有商品
for(auto itS=s.begin();itS!=s.end()&&k>0;++itS){
const pair&p=*itS;
if(K[p.first]>0) S[p.first].insert(p.second),--K[p.first],--k;//若该物品不超过选择数量则选择该物品
}
}
for(int j=0;j |