题目描述
世界上的大佬太多了,菜鸡们纷纷自闭并来到心理诊所寻求治疗,心理诊所 的每一个医生有不同的开始上班时间,能力 a 和收费 c,能力为 a 的医生可以治 好自闭程度小于或等于 a 的菜鸡。菜鸡们都很穷,所以他们只想要能治好他们 的最便宜的医生,请你告诉他们当前能治好他们病的最便宜的医生的价格。(假 设治疗在瞬间完成,同一个医生可以连续接待任意个客人)
输入
第一行一个正整数 T(T<=5),表示数据的组数
每组数据第一行一个正整数 n(n <= 10^5),表示接下来有 n 行。
接下来 n 行中,若第一个数为 0,则接下来两个正整数 a,c 表示有一个能力 为 a,收费为 c 的医生上班了。若第一个数为 1,则接下来有一个正整数 b,表 示有一个自闭程度为 b 的菜鸡来寻求治疗(1<=a,b,c <= 10^9
输出
对每个寻求治疗的菜鸡,输出一个整数表示治疗需要的花费,如果没有医生 能治好他,输出“-1”。
样例输入
1
8
1 19
0 17 5
0 1 6
1 12
1 15
0 5 7
0 3 9
1 3
样例输出
-1
5
5
5
知识点
- STL平衡二叉树(用模板就好)
- 自动排序容器:multiset
multiset
- mulitiset<> st //声明multiset类型的容器 st <>中存放数据类型
- st.insert//插入元素
- st.find//寻找元素
- st.erase//删除元素
复杂度都是log(n)
multiset中的自定义排序规则
模板
struct ru{
bool operator()(const DO &a,const DO &b)const
{
return a.c<b.c;
}
};
总代码
#include<iostream>
#include<cstring>
#include<set>//头文件
using namespace std;
struct DO{
int a,c;
};
//排序规则
struct ru{
bool operator()(const DO &a,const DO &b)const
{
return a.c<b.c;
}
};
int main()
{
multiset<struct DO,ru> l;//声明multiset类型DO 排序规则ru
bool istrue=false;//判断是否能医治好,一开始未不能
DO p;
int T,n,k,b;
cin>>T;
while(T--)
{
cin>>n;
multiset<struct DO,ru> l;
while(n--)
{
cin>>k;
if(k==0)
{
cin>>p.a>>p.c;
l.insert(p);
}
if(k==1)
{
cin>>b;
multiset<struct DO,ru>::iterator op;//迭代器(相当于指针)
for(op=l.begin();op!=l.end();op++)
{
if(b<=op->a)
{
cout<<op->c<<endl;
istrue=true;
break;
}
}
if(!istrue) cout<<"-1"<<endl;
istrue=false;
}
}
l.clear();//很关键清空l容器的存储
}
return 0;
}
如有错误,可以私信哦,共同进步!