• 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
    ",u);
            if (u==-1) {
                printf("0 0
    ");
                continue;
            }
            if (tt==-1) {
                printf("%d %d
    ",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
    ",u,ans);
        }
    }
  • 相关阅读:
    Android 捕获异常并在应用崩溃后重启应用
    Android 浏览器 —— 使用 WebView 实现文件下载
    给 Android 研发的一些的建议
    java.util.concurrent.RejectedExecutionException
    java的关闭钩子(Shutdown Hook)
    PGP工作原理及其安全体制
    漫画:什么是红黑树?
    LINUX下IDEA等工具调试项目时提示:Unable to open debugger port
    MongoDB aggregate 运用篇(转)
    Java8系列之重新认识HashMap
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/13627196.html
Copyright © 2020-2023  润新知