• codeforces 749D Leaving Auction(二分)


    题目链接:http://codeforces.com/problemset/problem/749/D

    题意:就是类似竞拍,然后报价肯定要比上一个高,然后查询输入k个数表示那些人的竞拍无效,

    输出最后谁竞拍到了花了多少钱。

    比较简单的二分只要找到删除无效人后最大的两个人然后用第二大的那个人的最大竞拍价二分查找

    最大的那个人中的竞拍价,然后的得到的第一个大于等于的值即可。

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    using namespace std;
    const int M = 2e5 + 10;
    vector<int>vc[M];
    int cp[M] , vis[M] , change[M];
    struct TnT {
        int num , val;
    }s[M];
    bool cmp(TnT a , TnT b) {
        return a.val > b.val;
    }
    int maxn , maxnnext , temp;
    void find() {
        int flag = 0;
        for(int i = 0 ; i < temp ; i++) {
            if(flag == 2) {
                break;
            }
            if(!vis[s[i].num]) {
                if(flag == 0) {
                    maxn = s[i].num;
                    flag++;
                    continue;
                }
                if(flag == 1) {
                    maxnnext = s[i].num;
                    flag++;
                    continue;
                }
            }
        }
    }
    int binsearch(int pos , int val) {
        int l = 0 , r = vc[pos].size() - 1;
        while(l <= r) {
            int mid = (l + r) >> 1;
            if(vc[pos][mid] >= val)
                r = mid - 1;
            else {
                l = mid + 1;
            }
        }
        return r + 1;
    }
    int main() {
        int n;
        cin >> n;
        for(int i = 0 ; i < n ; i++) {
            int x , y;
            cin >> x >> y;
            vc[x].push_back(y);
            cp[x] = y;
        }
        temp = 0;
        for(int i = 1 ; i <= M - 10 ; i++) {
            if(cp[i] != 0) {
                s[temp].num = i;
                s[temp++].val = cp[i];
            }
        }
        sort(s , s + temp , cmp);
        int q;
        cin >> q;
        while(q--) {
            int k;
            cin >> k;
            for(int i = 1 ; i <= k ; i++) {
                cin >> change[i];
                vis[change[i]] = 1;
            }
            maxn = 0 , maxnnext = 0;
            find();
            int gg = cp[maxnnext];
            int ans = binsearch(maxn , gg);
            if(maxn == 0) {
                cout << 0 << ' ' << 0 << endl;
            }
            else if(maxnnext == 0) {
                cout << maxn << ' ' << vc[maxn][0] << endl;
            }
            else {
                cout << maxn << ' ' << vc[maxn][ans] << endl;
            }
            for(int i = 1 ; i <= k ; i++) {
                vis[change[i]] = 0;
                change[i] = 0;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    前端构建工具gulp使用
    网页部分内容显示不全
    less简单入门
    jquery——移动端滚动条插件iScroll.js
    css3常用动画+动画库
    windows下nodejs环境配置
    jquery——滚动条插件jscroll.js
    工欲善其事必先利其器——dreamweaver
    jquery常用方法
    nodejs模块——http模块
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6211796.html
Copyright © 2020-2023  润新知