【HPU】神奇的操作 【vector +二分 】

提交: 13 解决: 3 统计
题目描述
有Q次操作,分两类:

1 x —— 向集合(可能会有相同元素)里面插入元素x。

2 y —— 查询集合里面第y大的元素。

输入
第一行输入一个整数t,代表有t组测试数据(t <= 10)

每组数据第一行输出一个整数Q,代表操作次数。

保证:1 <= Q <= 100000,且所有元素均在int范围内。

输出
对出现的第二个操作输出一个整数,代表结果,如果集合里面元素个数小于y,输出-1。

样例输入
2
2
1 2
2 2
3
1 1
1 3
2 2
样例输出
-1
1
来源
Ocean

因为可能有重复元素,所以要用vector 不然就可以用set了
代码

#include<bits/stdc++.h>
using namespace std;
#define LL long long
vector<int>V;
vector<int>::iterator  it;
int main(){
    int t;cin>>t;
    while(t--){
        V.clear();
        int q;cin>>q;
        while(q--){
            int a,b;
            scanf("%d%d",&a,&b);
            if(a==1){
                if(V.empty()) V.push_back(b);
                else {
                    it=lower_bound(V.begin(),V.end(),b);
                    if((it-V.begin())==V.size()) V.push_back(b);
                    else V.insert(it,b);
                }
            }else {
                if(V.size()<b) puts("-1");
                else printf("%d\n",V[V.size()-b]);
            }
        }
    }


    return 0;
}

/**************************************************************
    Problem: 1400
    User: 311609000717
    Language: C++
    Result: 正确
    Time:524 ms
    Memory:1820 kb
****************************************************************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值