zoukankan      html  css  js  c++  java
  • Codeforces Round #388 (Div. 2) D

    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
    6
    1 10
    2 100
    3 1000
    1 10000
    2 100000
    3 1000000
    3
    1 3
    2 2 3
    2 1 2
    output
    2 100000
    1 10
    3 1000
    input
    3
    1 10
    2 100
    1 1000
    2
    2 1 2
    2 2 3
    output
    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. 10
      2. 100
      3. 10 000
      4. 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
      2. 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. 1 000
      2. 1 000 000
      The winner is participant 3 with the bid 1 000.

    题意:有个拍卖会,然后出价(出价貌似是上升的),最后说有几个出价是失效的,问最后是哪个价格竞拍到了

    1 10
    2 100
    3 1000
    1 10000
    2 100000
    3 1000000
    比如这个,我们知道每人两次出价(价格上升),最后3出价失效,最后保留1 2,2的出价最高,输出2 10000

    解法:

    1 模拟

    2 没有剩下就是的0 0,剩下一个出价人就是取最高值

    3 如果留下多个,最后一个出价人的价格和倒数第二个出价比较,找一个比倒数第二个出价最高的还高的出价就行(不一定要最高),如果找不到就取当前的最大值

    4 说是数据结构,拿现成的工具套。。

     1 #include<bits/stdc++.h>
     2 typedef long long LL;
     3 typedef unsigned long long ULL;
     4 typedef long double LD;
     5 using namespace std;
     6 set<pair<int,int>>Se;
     7 vector<int>Ve[400000];
     8 int flag[400000];
     9 int query[200000];
    10 int main(){
    11     int n;
    12     scanf("%d",&n);
    13     for(int i=1;i<=n;i++){
    14         int a,b;
    15         scanf("%d%d",&a,&b);
    16         Ve[a].push_back(b);
    17         flag[a]=1;
    18     }
    19     for(int i=0;i<=n;i++){
    20         if(flag[i]){
    21             Se.insert({Ve[i][Ve[i].size()-1],i});
    22         }
    23     }
    24     int m;
    25     scanf("%d",&m);
    26     while(m--){
    27         int num;
    28         scanf("%d",&num);
    29         for(int i=1;i<=num;i++){
    30             scanf("%d",&query[i]);
    31             if(flag[query[i]]==0) continue;
    32             Se.erase({Ve[query[i]][Ve[query[i]].size()-1],query[i]});
    33         }
    34         if(Se.size()==0){
    35             printf("0 0
    ");
    36         }else if(Se.size()==1){
    37             printf("%d %d
    ",Se.begin()->second,Ve[Se.begin()->second][0]);
    38         }else{
    39             auto k = --Se.end();
    40             int t1 = k->first, t2 = k->second;
    41             Se.erase({t1, t2});
    42             auto l = --Se.end();
    43             printf("%d %d
    ", k->second, *upper_bound(Ve[t2].begin(), Ve[t2].end(), l->first));
    44             Se.insert({t1, t2});
    45         }
    46         for(int i=1;i<=num;i++){
    47             if(flag[query[i]]){
    48                 Se.insert({Ve[query[i]][Ve[query[i]].size()-1],query[i]});
    49             }
    50         }
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    C/C++打印堆栈信息
    adb shell input keyevent值所对应的字符
    Nautilus-Share-Message: Called "net usershare info" but it failed: Failed to
    ubuntu 安装lua错误
    ubuntu 16.04 安装jdk9错误
    国家统计信息查询网址
    Spring ApplicationListener配合-D实现参数初始化
    Feign Form表单POST提交
    window下绝对路径
    SpringBoot中使用配置文件
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/7223367.html
Copyright © 2011-2022 走看看