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.

Input

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.

Output

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.

Examples
input

Copy
6
1 10
2 100
3 1000
1 10000
2 100000
3 1000000
3
1 3
2 2 3
2 1 2
output

Copy
2 100000
1 10
3 1000
input

Copy
3
1 10
2 100
1 1000
2
2 1 2
2 2 3
output

Copy
0 0
1 10
Note

Consider the first sample:

  • In the first question participant number 3 is absent so the sequence of bids looks as follows:
    1. 1 10
    2. 2 100
    3. 1 10 000
    4. 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. 1 10
    2. 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:
    1. 3 1 000
    2. 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排序查找的更多相关文章

  1. CF749D Leaving Auction

    题目链接: http://codeforces.com/problemset/problem/749/D 题目大意: 一场拍卖会,共n个买家.这些买家共出价n次,有的买家可能一次都没有出价.每次出价用 ...

  2. Sublime文本排序&查找重复行&删除重复行

    排序 按F9或者选择菜单:Edit > Sort Lines,对每行文本进行排序 查找重复行 排序好后,按Ctrl+F,调出查找面板 查找字符串: ^(.+)$[\r\n](^\1$[\r\n] ...

  3. Leaving Auction

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

  4. Java进阶(三十九)Java集合类的排序,查找,替换操作

    Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...

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

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

  6. cf 749D Leaving Auction

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

  7. 猪八戒吃西瓜(wmelon)-排序-查找

    问题 A: 猪八戒吃西瓜(wmelon) 时间限制: 1 Sec  内存限制: 64 MB提交: 30  解决: 14[提交][状态][讨论版] 题目描述 有一天,贪吃的猪八戒来到了一个大果园,果园里 ...

  8. C/C++ 排序&&查找算法(面试)

    一.排序 1.冒泡排序 void BubbleSort(int array[],int n) { ; ; ; ; ;i<n - ;i++) /*外循环控制排序的总趟数*/ { flag = ; ...

  9. javascript排序 查找算法大全

    在pptv的实习结束了, 忙着找工作的事,顺便把数据结构的那本书重新复习了一遍.为了加深印象,特意把里面的常用的排序.查找算法用js写了一遍 具体的实例在我的github上,大家可以访问的: http ...

随机推荐

  1. WPF 之 DataTemplate 实例(摘抄)

     

  2. H3C ACL的标识

  3. Mail.Ru Cup 2018 Round 2 B. Alice and Hairdresser (bitset<> or 其他)

    传送门 题意: 给出你序列 a,在序列 a 上执行两种操作: ① 0 :查询有多少连续的片段[L,...,R],满足 a[L,...,R] > l: ② 1 p d :将第 p 个数增加 d: ...

  4. linux 内核定时器的实现

    为了使用它们, 尽管你不会需要知道内核定时器如何实现, 这个实现是有趣的, 并且值得 看一下它们的内部. 定时器的实现被设计来符合下列要求和假设: 定时器管理必须尽可能简化. 设计应当随着激活的定时器 ...

  5. H3C进入目录---用户视图

    进入logfile文件目录 <H3C>cd logfile/        //进入目录 <H3C>pwd             //显示当前所属的目录 cf:/logfil ...

  6. jquery自己写的幻灯片插件,好用不解释

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. ZR10.1青岛集训三地联考

    ZR10.1青岛集训三地联考 谢谢dijk和smy A 题目大意: 已知斐波那契数列\(f\) 设 \[ F_i = \sum_{i = 0}^nf_if_{n - i} \] 求 \[ \sum_{ ...

  8. CF1228——记一次和紫名失之交臂的CF

    CF1228--记一次和紫名失之交臂的CF 第无数次和暴涨失之交臂 A 题目大意给定\(l,r\)输出任意一个\(l,r\)之间的每一位都不同的数 \((l <= r <= 10^5)\) ...

  9. eclipse快捷键记录

    转自:http://blog.csdn.net/siphiababy/article/details/74179684 ctrl+2+L这个快捷键可自动补全代码,极大提升编码效率! 注:ctrl和2同 ...

  10. APK签名替换检测

    APK二次打包的危害 APK二次打包是Android应用安全风险中的一部分, 一般是通过反编译工具向应用中插入广告代码与相关配置,再在第三方应用市场.论坛发布.打包党对移动App带来的危害有以下几种: ...