CF749D Leaving Auction set排序查找
CodeForces 749D. Leaving Auction
There are n people taking part in auction today. The rules of auction are classical. There were n bids made, though it's not guaranteed they were from different people. It might happen that some people made no bids at all.
Each bid is define by two integers (ai, bi), where ai is the index of the person, who made this bid and bi is its size. Bids are given in chronological order, meaning bi < bi + 1 for all i < n. Moreover, participant never makes two bids in a row (no one updates his own bid), i.e. ai ≠ ai + 1 for all i < n.
Now you are curious with the following question: who (and which bid) will win the auction if some participants were absent? Consider that if someone was absent, all his bids are just removed and no new bids are added.
Note, that if during this imaginary exclusion of some participants it happens that some of the remaining participants makes a bid twice (or more times) in a row, only first of these bids is counted. For better understanding take a look at the samples.
You have several questions in your mind, compute the answer for each of them.
The first line of the input contains an integer n (1 ≤ n ≤ 200 000) — the number of participants and bids.
Each of the following n lines contains two integers ai and bi (1 ≤ ai ≤ n, 1 ≤ bi ≤ 109, bi < bi + 1) — the number of participant who made the i-th bid and the size of this bid.
Next line contains an integer q (1 ≤ q ≤ 200 000) — the number of question you have in mind.
Each of next q lines contains an integer k (1 ≤ k ≤ n), followed by k integers lj (1 ≤ lj ≤ n) — the number of people who are not coming in this question and their indices. It is guarenteed that lj values are different for a single question.
It's guaranteed that the sum of k over all question won't exceed 200 000.
For each question print two integer — the index of the winner and the size of the winning bid. If there is no winner (there are no remaining bids at all), print two zeroes.
6
1 10
2 100
3 1000
1 10000
2 100000
3 1000000
3
1 3
2 2 3
2 1 2
2 100000
1 10
3 1000
3
1 10
2 100
1 1000
2
2 1 2
2 2 3
0 0
1 10
Consider the first sample:
- In the first question participant number 3 is absent so the sequence of bids looks as follows:
- 1 10
- 2 100
- 1 10 000
- 2 100 000
Participant number 2 wins with the bid 100 000.
- In the second question participants 2 and 3 are absent, so the sequence of bids looks:
- 1 10
- 1 10 000
The winner is, of course, participant number 1 but the winning bid is 10 instead of 10 000 as no one will ever increase his own bid (in this problem).
- In the third question participants 1 and 2 are absent and the sequence is:
- 3 1 000
- 3 1 000 000
The winner is participant 3 with the bid 1 000.
题意:有n个人参加拍卖,一共有n次投标(这n个人中可以有人没投标也可以有人多次投标),投标按时间顺序给出:哪个人投标多少钱,注意不会有一个人连续两次投标(他不会自己和自己抢),现在问你如果有一些人没来参加拍卖的话,最终会是谁买花多少钱竞拍到。
题解:我们先要记录有哪些人参加了投标(可以用set,好方便计算最终参加投标的有多少人),以及他们每次投标的价格是多少(为了找到花费的最少的钱),每次询问的时候我们将不参加的人从set中删掉,如果最终没人投标那么输出0 0,如果参加投标的人只有一个显然输出那个人的编号和他第一次投标的价格,当参加投标的人超过一个时,我们可以找出出价最高的两个人,再在出价最高的人中选出他投标价格中比另一个人最高价高的最低价。注意询问结束后要将之前删掉的人加回去不影响后面的计算。这题用好set操作就行了。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <vector>
#include <cstdlib>
#define ll long long
#define ull unsigned ll
using namespace std;
const int N = 2e5 + ;
const double eps = 1e-;
vector<int> v[N];
int x[N];
struct node{
int id,ma;
node(int id,int ma) {
this->id = id;
this->ma = ma;
}
bool operator < (const node &x)const {
return ma > x.ma;
}
};
set<node> s;
int main() {
int n,a,b,q,k;
scanf("%d",&n);
for (int i = ; i < n; i++) {
scanf("%d%d",&a,&b);
v[a].push_back(b);
}
for (int i = ; i <= n; i++)
if (v[i].size()) s.insert(node(i,v[i][v[i].size()-]));
scanf("%d",&q);
while(q--) {
scanf("%d",&k);
for (int i = ; i < k; i++) {
scanf("%d",&x[i]);
if(v[x[i]].size() == ) continue;
s.erase(node(x[i],v[x[i]][v[x[i]].size()-]));
}
if (s.size() == ) printf("0 0\n");
else if (s.size() == ) {
a = s.begin()->id;
printf("%d %d\n", a,v[a][]);
} else {
set<node>::iterator t = s.begin();
int max1 = t->ma,pos1 = t->id;
s.erase(s.begin());
set<node>::iterator it = s.begin();
int max2 = it->ma,pos2 = it->id;
int i = upper_bound(v[pos1].begin(),v[pos1].end(),max2)-v[pos1].begin();
printf("%d %d\n", pos1,v[pos1][i]);
s.insert(*t);
}
for (int i = ; i < k; i++) {
if (v[x[i]].size() == ) continue;
s.insert(node(x[i],v[x[i]][v[x[i]].size()-]));
}
}
return ;
}
CF749D Leaving Auction set排序查找的更多相关文章
- CF749D Leaving Auction
题目链接: http://codeforces.com/problemset/problem/749/D 题目大意: 一场拍卖会,共n个买家.这些买家共出价n次,有的买家可能一次都没有出价.每次出价用 ...
- Sublime文本排序&查找重复行&删除重复行
排序 按F9或者选择菜单:Edit > Sort Lines,对每行文本进行排序 查找重复行 排序好后,按Ctrl+F,调出查找面板 查找字符串: ^(.+)$[\r\n](^\1$[\r\n] ...
- Leaving Auction
Leaving Auction 题目链接:http://codeforces.com/contest/749/problem/D 二分 本来以为是哪种神奇的数据结构,没想到sort+lower_bon ...
- Java进阶(三十九)Java集合类的排序,查找,替换操作
Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...
- Codeforces 749D. Leaving Auction set+二分
D. Leaving Auction time limit per test: 2 seconds memory limit per test:256 megabytes input:standard ...
- cf 749D Leaving Auction
Leaving Auction time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- 猪八戒吃西瓜(wmelon)-排序-查找
问题 A: 猪八戒吃西瓜(wmelon) 时间限制: 1 Sec 内存限制: 64 MB提交: 30 解决: 14[提交][状态][讨论版] 题目描述 有一天,贪吃的猪八戒来到了一个大果园,果园里 ...
- C/C++ 排序&&查找算法(面试)
一.排序 1.冒泡排序 void BubbleSort(int array[],int n) { ; ; ; ; ;i<n - ;i++) /*外循环控制排序的总趟数*/ { flag = ; ...
- javascript排序 查找算法大全
在pptv的实习结束了, 忙着找工作的事,顺便把数据结构的那本书重新复习了一遍.为了加深印象,特意把里面的常用的排序.查找算法用js写了一遍 具体的实例在我的github上,大家可以访问的: http ...
随机推荐
- oracle 用表连接替换EXISTS
通常来说 , 采用表连接的方式比EXISTS更有效率 SELECT ENAME FROM EMP E WHERE EXISTS (SELECT ‘X’ FROM DEPT WHERE DEPT_NO ...
- 七个用于数据科学(data science)的命令行工具
七个用于数据科学(data science)的命令行工具 数据科学是OSEMN(和 awesome 相同发音),它包括获取(Obtaining).整理(Scrubbing).探索(Exploring) ...
- 2019-8-15-win10-edge-打开闪退问题
title author date CreateTime categories win10 edge 打开闪退问题 lindexi 2019-08-15 08:53:22 +0800 2019-8-1 ...
- 【p083】传球游戏
Time Limit: 1 second Memory Limit: 50 MB [问题描述] 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样 ...
- P1067 叠罗汉
题目描述 茜茜和聪聪是关系很好的同桌,有一天,茜茜觉得天空中的白云像棉花糖一样,应该很好吃吧,但是够不着,她很烦恼. 聪聪为了帮助茜茜解决烦恼,决定帮他把天空中的白云摘下来做成棉花糖给她吃. 但是聪聪 ...
- 2018-9-2-WPF-开发自动删除软件
title author date CreateTime categories WPF 开发自动删除软件 lindexi 2018-09-02 14:51:48 +0800 2018-08-09 09 ...
- dotnet 通过 WMI 获取系统安装软件
本文告诉大家如何通过 WMI 获取系统安装的软件,这个方法不能获取全部的软件 通过 Win32_Product 可以获取系统安装的软件 var mc = "Win32_Product&quo ...
- H3C 迭代查询
- Linux 内核PCI去除一个设备
一个 PCI 可用多个不同的方法被从系统中去除. 所有的 card-bus 设备在一个不同的物 理因素上是真正的 PCI 设备, 并且内核 PCI 核心不区分它们. 允许在机器运行时加减 PCI 设备 ...
- 为什么我们要使用DTO
基础结构解释 UI-表现层-与控制器打交道(UI向Controller 传递数据时使用DTO(数据传输对象)) Service-应用服务层 Domain 领域对象 DTO 数据传输对象,一般只包含基础 ...