zoukankan      html  css  js  c++  java
  • cf 749D Leaving Auction

    Leaving Auction

    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    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. 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个竞标,a[i],b[i].a[i]表示人的序号,b[i]表示竞标价格。接下来有q个询问,每次一个k,之后k个数表示该序号的人缺席。问谁最终以多少钱得标。如果没有输出0 0,否则输出序号和价钱。
    • 我们要按竞标价格排个序 然后删除那些缺席人 找到竞标价格第一大和第二大的  用二分找到第一大的人中投标的价格大于第二大投标的最大价格
    • 注意的是那个删除来找第一第二大的地方 用vector超时了 换成set过了
    •   1 #include<iostream>
        2 #include<cstdio>
        3 #include<algorithm>
        4 #include<cstring>
        5 #include<cstdlib>
        6 #include<string.h>
        7 #include<set>
        8 #include<vector>
        9 #include<queue>
       10 #include<stack>
       11 #include<map>
       12 #include<cmath>
       13 typedef long long ll;
       14 typedef unsigned long long LL;
       15 using namespace std;
       16 const double PI=acos(-1.0);
       17 const double eps=0.0000000001;
       18 const int N=500000+100;
       19 const ll mod=1e9+7;
       20 const int INF=0x3f3f3f3f;
       21 struct node{
       22     int maxx=0;
       23     int pos;
       24 }a[N];
       25 int b[N];
       26 vector<int>ans[N];
       27 set<pair<int,int> >aa,bb;
       28 int maxx[N];
       29 int vis[N];
       30 int check(int x,int y){
       31     int i=ans[y].size()-1;
       32     int tt=ans[y][i];
       33     int low=0;
       34     int high=ans[x].size()-1;
       35     int anss=ans[x][0];
       36     while(low<=high){
       37         int mid=(low+high)>>1;
       38         if(ans[x][mid]>=tt){
       39             high=mid-1;
       40             anss=ans[x][mid];
       41         }
       42         else{
       43             low=mid+1;
       44         }
       45     }
       46     return anss;
       47 }
       48 int main(){
       49     int n;
       50     int x,y;
       51     int t=0;
       52     cin>>n;
       53     memset(vis,0,sizeof(vis));
       54    // for(int i=0;i<=n;i++)ans[i].clear();
       55     for(int i=1;i<=n;i++){
       56         scanf("%d%d",&x,&y);
       57         a[i].maxx=y;
       58         a[i].pos=x;
       59         ans[x].push_back(y);
       60     }
       61     memset(b,0,sizeof(b));
       62     for(int i=n;i>=1;i--){
       63         if(vis[a[i].pos]==0){
       64             aa.insert(make_pair(-i,a[i].pos));
       65             vis[a[i].pos]=i;continue;
       66         }
       67 
       68     }
       69     set<pair<int,int> >::iterator it;
       70     int q;
       71     scanf("%d",&q);
       72     //vector<int>::iterator it;
       73     while(q--){
       74         int m;
       75         scanf("%d",&m);
       76         for(int i=1;i<=m;i++){
       77             scanf("%d",&x);
       78             b[i]=x;
       79             if(vis[x]==0)continue;
       80             //cout<<a[vis[x]].pos<<" "<<-vis[x]<<endl;
       81             aa.erase(make_pair(-vis[x],a[vis[x]].pos));
       82         }
       83         if(aa.size()==0){
       84             cout<<0<<" "<<0<<endl;
       85         }
       86         else if(aa.size()==1){
       87             int t=aa.begin()->second;
       88             int t1=ans[t][0];
       89             cout<<t<<" "<<t1<<endl;
       90         }
       91         else{
       92             int t=aa.begin()->second;
       93             int t1=(++aa.begin())->second;
       94             cout<<t<<" "<<check(t,t1)<<endl;
       95         }
       96         for(int i=1;i<=m;i++){
       97             x=b[i];
       98             if(vis[x]){
       99                 aa.insert(make_pair(-vis[x],a[vis[x]].pos));
      100             }
      101         }
      102     }
      103 }
  • 相关阅读:
    20145225 实验四《Andoid开发基础》
    20145235 《Java程序设计》第9周学习总结
    20145235实验三队友(20145225)
    20145235 《Java程序设计》第8周学习总结
    20145235《Java程序设计》第7周学习总结
    20145235 《Java程序设计》实验二
    20145235 《Java程序设计》第一次实验报告
    20145235 《Java程序设计》第6周学习总结
    20145232韩文浩《网络对抗》PC平台逆向破解
    20145232韩文浩《网络对抗》 恶意代码分析
  • 原文地址:https://www.cnblogs.com/Aa1039510121/p/7688275.html
Copyright © 2011-2022 走看看