博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cf 749D Leaving Auction
阅读量:5165 次
发布时间:2019-06-13

本文共 1353 字,大约阅读时间需要 4 分钟。

题意:拍卖一件物品,有n个竞标,一个人可以有多个竞标。给出n个竞标,a[i],b[i].a[i]表示人的序号,b[i]表示竞标价格。

           接下来有q个询问,每次一个k,之后k个数表示该序号的人缺席。问谁最终以多少钱得标。如果没有输出0 0,否则输出序号和价钱。

 

 

思路:可以按竞标价格排个序,先将所有人逆序加入set集合中,由于set会自动排序,所以set中存2个元素,

           一个用来防止其加入自动排序,一个存每个人的编号。然后再将未出席的删除,如果最后set中没有人了,

           则输出0 0,如果还剩1个,则输出该人的最小出价,否则的话,输出set中第一个人所有出价中第一次大于

           set中第2个人的最大出价的出价,可以用二分查找。 set删除一个数的时间复杂度为O(logn),vector为O(n), 

           

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;vector
mp[200005];set
>aa;int a[200005],v[200005],b[200005];int fun(int x,int y){ int k=mp[y].size(); int m=mp[y][k-1]; int r=mp[x].size()-1; int l=0; while(l
=1;i--) { if(!v[a[i]]) { aa.insert(make_pair(-i,a[i])); v[a[i]]=i; } } set
>::iterator it; int t; scanf("%d",&t); while(t--) { int k; scanf("%d",&k); for(int i=1;i<=k;i++) { scanf("%d",&w); b[i]=w; if(v[w]==0) continue; aa.erase(make_pair(-v[w],w)); } if(aa.size()==0) printf("0 0\n"); else if(aa.size()==1) { int x=aa.begin()->second; printf("%d %d\n",x,mp[x][0]); } else { int x=aa.begin()->second; int y=(++aa.begin())->second; printf("%d %d\n",x,fun(x,y)); } for(int i=1;i<=k;i++) { if(v[b[i]]) aa.insert(make_pair(-v[b[i]],b[i])); } } return 0;}

  

所以这题用vector会时间超限。

转载于:https://www.cnblogs.com/zcb123456789/p/11330728.html

你可能感兴趣的文章
静态库制作-混编(工程是oc为基础)
查看>>
jQuery 显示加载更多
查看>>
代理模式
查看>>
Confluence 6 系统运行信息中的 JVM 内存使用情况
查看>>
Confluence 6 升级以后
查看>>
用JS实现版面拖拽效果
查看>>
二丶CSS
查看>>
《avascript 高级程序设计(第三版)》 ---第二章 在HTML中使用Javascript
查看>>
JS一些概念知识及参考链接
查看>>
TCP/IP协议原理与应用笔记24:网际协议(IP)之 IP协议的简介
查看>>
SAP HANA开发中常见问题- 基于SAP HANA平台的多团队产品研发
查看>>
游戏中的心理学(一):认知失调有前提条件
查看>>
WHAT I READ FOR DEEP-LEARNING
查看>>
【Ruby】Ruby在Windows上的安装
查看>>
Objective C 总结(十一):KVC
查看>>
BZOJ 3747 洛谷 3582 [POI2015]Kinoman
查看>>
vue实战(7):完整开发登录页面(一)
查看>>
Visual Studio自定义模板(二)
查看>>
【Mood-20】滴滤咖啡做法 IT工程师加班必备 更健康的coffee 项目经理加班密鉴
查看>>
读《构建之法-软件工程》第四章有感
查看>>