题目链接:

http://codeforces.com/problemset/problem/749/D

题目大意:

一场拍卖会,共n个买家。这些买家共出价n次,有的买家可能一次都没有出价。每次出价用(ai,bi)表示,ai为此次出价人的编号,bi为价格。出价严格递增(bi<bi+1)并且没有玩家在一轮竞拍中在没有其他竞争对手的情况下自动增加自己的出价(ai!=ai+1)。现在给定q次查询,每次去掉一些出价者及其所有出价,问最后谁是赢家并且他以什么价格赢得拍卖品。

解题思路:

首先预处理所有的出价,保存每个买家的出价序列,最高出价和最低出价。然后维护一个set。其中保存出价者id和他的出价序列中的最高出价maxn,整个set按照maxn从大到小的顺序排序。对于每次查询,从set中删掉出局的人,如果此时set大小为0,输出“0 0”;大小为1,则只有一个买家,他赢得了拍卖品且价格为他的所有出价中的最小值;否则找maxn最高的人和第二高的人。最终的价格应该是在maxn最高的人的出价序列中比maxn第二高的人的最高出价高一点点的值。考虑到是有序的,二分即可。之后不要忘了把之前剔除掉的人再insert回来。

开始时我在set的每个节点中保存了相应买家的出价序列,结果T了很多次,真是被自己蠢哭了......

代码:

 #include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
vector<int> G[];
int n, a, b;
int maxn[];
int minn[];
int d[];
int max(int a, int b)
{
return a > b ? a : b;
}
int min(int a, int b)
{
return a < b ? a : b;
}
struct node
{
int index;
int maxn;
};
struct cmp
{
bool operator ()(const node & a, const node & b)const
{
return a.maxn > b.maxn;
}
};
int main()
{
cin >> n;
memset(minn, 0x3f, sizeof(minn));
for (int i = ; i < n; i++)
{
scanf("%d %d", &a, &b);
G[a].push_back(b);
maxn[a] = max(maxn[a], b);
minn[a] = min(minn[a], b);
}
set<node, cmp> s;
for (int i = ; i <= n; i++)
{
if (G[i].size())
{
node tmp;
tmp.index = i;
tmp.maxn = maxn[i];
s.insert(tmp);
}
}
int T, x;
cin >> T;
for (int i = ; i < T; i++)
{
scanf("%d", &x);
for (int j = ; j < x; j++)
{
scanf("%d", &d[j]);
node t;
t.index = d[j];
t.maxn = maxn[d[j]];
s.erase(t);
}
if (s.size() == )
{
puts("0 0");
}
else if (s.size() == )
{
printf("%d %d\n", s.begin()->index, minn[s.begin()->index]);
}
else
{
set<node, cmp>::iterator t = s.begin();
node y;
y.index = t->index;
y.maxn = t->maxn;
s.erase(s.begin());
set<node, cmp>::iterator t2 = s.begin();
vector<int>::iterator it;
it = upper_bound(G[t->index].begin(), G[t->index].end(), t2->maxn);
if (it != G[t->index].end())
{
printf("%d %d\n", y.index, *it);
}
else
{
puts("0 0");
}
s.insert(y);
}
for (int j = ; j < x; j++)
{
node t;
t.index = d[j];
t.maxn = maxn[d[j]];
if (G[t.index].size())
s.insert(t);
}
}
return ;
}

最新文章

  1. python成长之路-----day1----笔记(1)
  2. :“boost/serialization/string.hpp”: No such file or directory 错误
  3. Java 使用反射拷贝对象一般字段值
  4. C#中的深拷贝与浅拷贝
  5. Angular.js vs Ember.js
  6. Codeforces 543D Road Improvement
  7. 《JavaScript Dom编程艺术》用例总结
  8. Octave Tutorial(《Machine Learning》)之第四课《绘图数据》
  9. angular二级联动菜单
  10. encodeURI与decodeURI
  11. JS表单提交的几种方式
  12. Characterization of Dynkin diagrams
  13. vue兄弟组件传递信息
  14. springcloud config
  15. C# event关键字
  16. Dreamweaver 2
  17. wordpress写文章添加gif图片变成静态图片的解决办法
  18. CRTD异常案例及原因
  19. 【转】树莓派Raspberry Pi - 还原已经装过系统的TF卡
  20. linux中服务环境的搭建

热门文章

  1. android TextView 设置部分文字背景色 和 文字颜色
  2. oracle重命名数据文件
  3. [Selenium] The commonly used operation of element
  4. AFNetworking源码的学习
  5. 【NOIP2014】 联合权值
  6. Hadoop 三大调度器源码分析及编写自己的调度器
  7. eclipse配置环境基本设置
  8. 简析hotjar录屏功能实现原理
  9. POJ1050【DP】
  10. qq教xixi写模拟加法【非常爆炸】