Codeforces 749D. Leaving Auction set+二分
2 seconds
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.
题目链接:http://codeforces.com/problemset/problem/749/D
题意:有n次竞价,每次竞价格式为ai和bi(ai表示第i次竞标人的编号,bi表示第i次竞标的价格)。bi < bi + 1。自己不和自己竞标,即ai != ai + 1。q次询问,每次询问中有k中标号无效竞标,求每次询问后物品竞标编号和价格。
思路:set+二分。把每个人竞标的最高价和标号存储入set。每次询问,从set中删除k中标号。如果最后set为空,那么说明无人竞标输出0 0;如果set大小为1,那么说明只有一个人竞标,只需输出最低价格。如果set大小大于1,那么set中价格最高的标号为pos的人竞标成功。但是自己不能和自己竞标,所以最后的竞标价格为在pos所有的竞标价格中二分大于set中价格第二高的价格,为最终价格。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
using namespace std;
const int MAXN=2e5+;
vector<int>v[MAXN];
int vis[MAXN],Max[MAXN];
int del[MAXN];
int main()
{
int n;
scanf("%d",&n);
for(int i=; i<=n; i++)
{
int a,b;
scanf("%d%d",&a,&b);
v[a].push_back(b);
vis[a]=;
Max[a]=max(Max[a],b);
}
set<pair<int,int> >s;
for(int i=; i<=n; i++)
if(vis[i]) s.insert(make_pair(Max[i],i));
int q;
scanf("%d",&q);
while(q--)
{
int k;
scanf("%d",&k);
for(int i=; i<=k; i++)
{
scanf("%d",&del[i]);
if(vis[del[i]]) s.erase(make_pair(Max[del[i]],del[i]));
}
if(s.size()==) cout<<<<" "<<<<endl;
else if(s.size()==)
cout<<s.begin()->second<<" "<<v[s.begin()->second][]<<endl;
else
{
set<pair<int,int> >::iterator it=s.end();
it--;
int pos=it->second;
it--;
int num=it->first;
int ans=upper_bound(v[pos].begin(),v[pos].end(),num)-v[pos].begin();
cout<<pos<<" "<<v[pos][ans]<<endl;
}
for(int i=; i<=k; i++)
if(vis[del[i]]) s.insert(make_pair(Max[del[i]],del[i]));
}
return ;
}
Codeforces 749D. Leaving Auction set+二分的更多相关文章
- codeforces 749D Leaving Auction(二分)
题目链接:http://codeforces.com/problemset/problem/749/D 题意:就是类似竞拍,然后报价肯定要比上一个高,然后查询输入k个数表示那些人的竞拍无效, 输出最后 ...
- CodeForces 749D Leaving Auction
二分查找,$set$. 对于某一次询问,如果把人删光了,那么输出$0$ $0$. 如果只剩下$1$个人,那么输出那个人喊的最低价格. 如果剩下的人数有大于等于两个, 这时最底下出现的情景必然是红色部分 ...
- cf 749D Leaving Auction
Leaving Auction time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- CF749D Leaving Auction set排序查找
CodeForces 749D. Leaving Auction 传送门 There are n people taking part in auction today. The rules of a ...
- Leaving Auction
Leaving Auction 题目链接:http://codeforces.com/contest/749/problem/D 二分 本来以为是哪种神奇的数据结构,没想到sort+lower_bon ...
- Codeforces 749D:Leaving Auction(set+二分)
http://codeforces.com/contest/749/problem/D 题意:有几个人在拍卖场竞价,一共有n次喊价,有q个询问,每一个询问有一个num,接下来num个人从这次拍卖中除去 ...
- 【codeforces 749D】Leaving Auction
[题目链接]:http://codeforces.com/problemset/problem/749/D [题意] 有n个人在竞价; 按照时间的顺序给出n次竞价(可能有一些人没有参加竞价); 每次竞 ...
- Leaving Auction CodeForces - 749D (set,贪心,模拟)
大意: 若干个人参加拍卖会, 给定每个人出价顺序, 保证价格递增, q个询问, 给出k个人的编号, 求删除这k个人的所有出价后, 最终谁赢, 他最少出价多少. set维护每个人最后一次投票的时间, 每 ...
- Leaving Auction CF 749D
题目:http://codeforces.com/problemset/problem/749/D 题目大意: 有n个人竞拍,也有n个叫牌,一个人可以有多个叫价牌,但也可能有一些人根本不叫价 每个叫牌 ...
随机推荐
- java-学习2
第一节 Java语言介绍 1.Java的起源 Oak-->Java 交互式操作智能家居 2.Java的发展 Java1.0 Java1.2 JavaSE :Java平台标准版 ...
- css 鼠标选中内容背景色
::selection { background: rgba(32, 178, 170, .6); color: #ffffff; } ::-moz-selection { background: r ...
- Bootstrap Tooltip
[Bootstrap Tooltip] 1.设置Tooltip: 1)data-toggle="tooltip" 2)data-placement="top", ...
- Flux architecture
[Flux architecture] Flux is a pattern for managing data flow in your application. The most important ...
- 使用SpirngMvc拦截器实现对登陆用户的身份验证
登陆成功则按returnUrl进行跳转,即跳转到登陆之前的页面,否则跳转到登陆页面,返回登陆错误信息. 1.SpringMVC.xml <!-- 映射器 --> <bean clas ...
- JMeter学习(五)集合点(转载)
转载自 http://www.cnblogs.com/yangxia-test JMeter也有像LR中的集合点,本篇就来介绍下JMeter的集合点如何去实现. JMeter里面的集合点通过添加定时器 ...
- Python基础之初始编码
前言 程序中的编码问题你不搞明白,那么你的程序生涯中它会像幽灵一样伴随着你的职业生涯. 首先要搞清楚一个概念:计算机中认识什么?它认识的是010101这种二进制,却不认识中文不认识英文 那么,这个时候 ...
- commit 流程
COMMIT是一个非常快的操作,当我们发布commit命令时,真正困难的动作已经完成,在数据库中已经执行了数据更改,所以已经完成了99%的任务,例如:下列操作已经产生: 1.在SGA(Buffer C ...
- C/s程序过时了吗?
目前的程序从原来的形态演变成了 C/s,B/s,和手机端. 其实应该各有自己的客户群,及定位. 比如C/s为单机版的可以完成个性化突出的复杂客户端应用,企业级别的应用. B/s的特点安装简单,功能制作 ...
- NumPy IO
NumPy IO Numpy 可以读写磁盘上的文本数据或二进制数据. NumPy 为 ndarray 对象引入了一个简单的文件格式:npy. npy 文件用于存储重建 ndarray 所需的数据.图形 ...