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. iptables智能DNS

    1. echo 1 > /proc/sys/net/ipv4/ip_forward 2. 在NAT服务器上添加以下规则: 在PREROUTING链中添加目的地址转换规则: iptables -t ...

  2. echarts细节的修改(2):矩形数图,柱状图,折线图,雷达图等

    1.矩形数图的配置,是直接拿饼图的配置 然后将type换成treemap. 修改类型 option.series.type = 'treemap'; 关闭面包屑导航 option.series.bre ...

  3. hdu 1548 A strange lift(迪杰斯特拉,邻接表)

    A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  4. get和post的区别?

    GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符 POST:一般用于 修改服务器上的资源,对所发送的信息没有限制. GET方式需要使用Request.Qu ...

  5. HDU 1875 最小生成树prim算法

    #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #inc ...

  6. 五分钟搭建一个基于BERT的NER模型

    BERT 简介 BERT是2018年google 提出来的预训练的语言模型,并且它打破很多NLP领域的任务记录,其提出在nlp的领域具有重要意义.预训练的(pre-train)的语言模型通过无监督的学 ...

  7. 机器学习-RBF高斯核函数处理

     机器学习-RBF高斯核函数处理 SVM高斯核函数-RBF优化 重要了解数学的部分: 协方差矩阵,高斯核函数公式. 个人建议具体的求法还是看下面的核心代码吧,更好理解,反正就我个人而言,烦躁的公式,还 ...

  8. uni-app学习记录04-轮播图和滑屏图片

    <template> <view> <!-- 轮播图视图 swiper-item是每页的元素 --> <swiper :indicator-dots=&quo ...

  9. Python--day60--一个简单(不完整)的web框架

  10. npm install 报错(npm ERR! errno -4048,Error: EPERM: operation not permitted)

    问题现象 原因 1.初次看报错日志内容,定义权限为问题,后来查资料才知道是缓存问题. 解决方法 1.简单直接 直接删除 npmrc文件 tips: 不是nodejs安装目录npm模块下的那个npmrc ...