题目链接:

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 ;
}

CF749D Leaving Auction的更多相关文章

  1. CF749D Leaving Auction set排序查找

    CodeForces 749D. Leaving Auction 传送门 There are n people taking part in auction today. The rules of a ...

  2. Leaving Auction

    Leaving Auction 题目链接:http://codeforces.com/contest/749/problem/D 二分 本来以为是哪种神奇的数据结构,没想到sort+lower_bon ...

  3. Codeforces 749D. Leaving Auction set+二分

    D. Leaving Auction time limit per test: 2 seconds memory limit per test:256 megabytes input:standard ...

  4. cf 749D Leaving Auction

    Leaving Auction time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  5. Codeforces 749D:Leaving Auction(set+二分)

    http://codeforces.com/contest/749/problem/D 题意:有几个人在拍卖场竞价,一共有n次喊价,有q个询问,每一个询问有一个num,接下来num个人从这次拍卖中除去 ...

  6. CodeForces 749D Leaving Auction

    二分查找,$set$. 对于某一次询问,如果把人删光了,那么输出$0$ $0$. 如果只剩下$1$个人,那么输出那个人喊的最低价格. 如果剩下的人数有大于等于两个, 这时最底下出现的情景必然是红色部分 ...

  7. Leaving Auction CF 749D

    题目:http://codeforces.com/problemset/problem/749/D 题目大意: 有n个人竞拍,也有n个叫牌,一个人可以有多个叫价牌,但也可能有一些人根本不叫价 每个叫牌 ...

  8. D. Leaving Auction 一题很好的思维题

    http://codeforces.com/contest/749/problem/D 现在发现做题要把样例抄下来,然后画一画,这样才容易发现新大陆.嗯,以后做题就这样. 如果排除了被删除了的人,那么 ...

  9. 【codeforces 749D】Leaving Auction

    [题目链接]:http://codeforces.com/problemset/problem/749/D [题意] 有n个人在竞价; 按照时间的顺序给出n次竞价(可能有一些人没有参加竞价); 每次竞 ...

随机推荐

  1. HDU 5438 Ponds

    Ponds Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Sub ...

  2. vue 数组和对象渲染问题

    vue 数组和对象渲染问题 最近项目有点忙碌,遇到好多问题都没有总结(╥﹏╥),在开发过程中,取vuex中的数组渲染完成之后,再次修改数组的值,数据更新了,但是视图并没有更新.以为是数组更新的问题,后 ...

  3. html5--6-44信纸设计

    html5--6-44信纸设计 实例 <!doctype html> <html> <head> <meta charset="utf-8" ...

  4. 无限轮播器的bug修复

    前言:上一回实现了轮播器的自动滚动,但是有两个需要处理的bug. 1.增加需求:当用手拖拽控制轮播器的时候,停止自动滚动. 2.当同一个页面中有tableView,textView或scrollvie ...

  5. 【POJ 2407】 Relatives

    [题目链接] 点击打开链接 [算法] 欧拉函数 [代码] #include <algorithm> #include <bitset> #include <cctype& ...

  6. Balancing Act(树的重心)

    传送门 Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14070   Accepted: 593 ...

  7. bzoj 2238 Mst —— 树剖+mn标记永久化

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2238 看了半天... 首先,想要知道每条边删除之后的替代中最小的那个: 反过来看,每条不在 ...

  8. 洛谷P3830 [SHOI2012]随机树——概率期望

    题目:https://www.luogu.org/problemnew/show/P3830 询问1:f[x]表示有x个叶节点的树的叶节点平均深度: 可以把被扩展的点的深度看做 f[x-1] ,于是两 ...

  9. iphone 在设置了initial-scale=1 之后,在设置滚动条之后,没有滑动效果的解决办法

    iphone在设置了initial-scale=1 之后,我们终于可以以1:1 的比例进行页面设计了. 关于viewport,还有一个很重要的概念是:iphone 的safari 浏览器完全没有滚动条 ...

  10. WaveNet: 原始音频生成模型

    官方博客 WaveNet: A Generative Model for Raw Audio paper地址:paper Abstract WaveNet是probabilistic and auto ...