zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    return和yield的区别
    基本装饰器
    javascript实例:两种方式实现tab栏选项卡
    javascript实例:路由的跳转
    javascript实例:点亮灯泡
    标签页QTabWidget
    主窗口QMainWindow和启动画面
    各种对话框
    列表视图QlistView
    拆分窗口QSplitter
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6211796.html
Copyright © 2011-2022 走看看