CF749D Leaving Auction(二分)

题意:

给出一些人的拍卖顺序,每次询问删除一些人,谁将拍得商品。输出这个人的编号和他的出价。

当这个人的出价后面没有其他人出过价的时候,就是用这个价格拍下商品。

题解:

每次标记删除的人

查找当前数据结构里的最大出价的持有者

二分这个持有者的所有出价,找到答案

再把删除的人插入数据结构

删除和插入的时间复杂度为logn.

数据结构随意。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;
//每次标记删除的人
//查找当前数据结构里的最大出价的持有者
//二分这个持有者的所有出价,找到答案
//再把删除的人插入数据结构
//删除和插入的时间复杂度为logn
inline int read () {
    int x=0;
    int f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9') {
        if (ch=='-') f=-1;ch=getchar();
    }
    while (ch>='0'&&ch<='9') {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
int n;
int a[maxn];
int b[maxn];
int ed[maxn];
int st[maxn];
int t[maxn];
vector<int> g[maxn];
int main () {
    n=read();
    for (int i=1;i<=n;i++) g[i].push_back(-1);
    vector<pair<int,int> > v;
    for (int i=1;i<=n;i++) {
        a[i]=read(),b[i]=read();
        g[a[i]].push_back(b[i]);
        ed[a[i]]=b[i];
    }
    for (int i=1;i<=n;i++) if (g[i].size()>1) v.push_back(make_pair(ed[i],i));
    sort(v.begin(),v.end());
    int q;
    q=read();
    while (q--) {
        map<int,int> mp;
        int k;
        k=read();
        for (int i=1;i<=k;i++) {
            t[i]=read();
            mp[t[i]]=1;
        }
        int u=-1;
        int tt=-1;
        int f=0;
        for (int i=v.size()-1;i>=0;i--) {
            if (!mp[v[i].second]&&!f)  {
                u=v[i].second;
                f++;
            }
            else if (!mp[v[i].second]&&f==1) {
                tt=v[i].second;
                break;
            }
        }
        //printf("%d\n",u);
        if (u==-1) {
            printf("0 0\n");
            continue;
        }
        if (tt==-1) {
            printf("%d %d\n",u,g[u][1]);
            continue;
        }
        int l=1,r=g[u].size()-1;
        int ans=-1;
        while (l<=r) {
            int mid=(l+r)>>1;
            if (g[u][mid]>=ed[tt]) {
                ans=g[u][mid];
                r=mid-1;
            }
            else {
                l=mid+1;
            }
        }
        printf("%d %d\n",u,ans);
    }
}

 

posted @ 2020-09-07 15:31  zlc0405  阅读(123)  评论(0编辑  收藏  举报