目录
题目大意
一个病人到达医院后,会自动挂号、评测病情的紧急程度,并且会将信息加入到医院的叫号系统。叫号系统内保证所有排队的病人中所有的id 和紧急程度 urg 均不相同。
医院的叫号系统非常奇怪,我们认为叫号系统有多种操作,对于每种操作都会有一个操作编号 op,操作包括:
- 若op=1,认为医院来了一个新的病人,编号为 id,病情的紧急程度为urg,需要将他的信息加入到叫号系统内。
- 若op=2,医生现在开始叫号,医生会选择紧急程度最小的病人。输出此病人的
id
并将他的信息从叫号系统中删除;如果没有这样的病人,则输出error
。 - 若 op=3,医生现在开始叫号,医生会选择紧急程度最大的病人。输出此病人的
id
并将他的信息从叫号系统中删除;如果没有这样的病人,则输出error
。 - 若op=4,将叫号系统中编号为id 的病人的紧急程度修改为urg。叫号系统中一定有该病人,并且新的紧急程度与其他病人的紧急程度不冲突。
- 若 op=5,将叫号系统中紧急程度为urg 的病人的编号修改为 id。叫号系统中一定有该病人,并且新的编号与其他病人的编号不冲突。
- 若 op=6,医生想要查询编号为 id 的病人的紧急程度并输出,如果没有该病人,则输出
error
。 - 若 op=7,医生想要查询紧急程度为 urg 的病人的编号并输出,如果没有该病人,则输出
error
。
输入格式
第一行,一个正整数 n,表示操作的数量。
接下来 n 行,代表每次操作,每行的第一个数为 op,若:
- op=1,输入两个以空格隔开的正整数id,urg;
- op=2,该行没有其它输入。
- op=3,该行没有其它输入。
- op=4,输入两个以空格隔开的正整数 id,urg;
- op=5,输入两个以空格隔开的正整数id,urg;
- op=6,输入一个正整数id;
- op=7,输入一个正整数 urg。
保证数据一直合法,并且变量含义如题意所示。
输出格式
输出若干行,依次按照操作 2∼3,6∼7,按照要求进行输出。
数据范围
对于30% 的数据,1≤n≤100;
对于 60% 的数据,1≤n≤1000;
对于100% 的数据,1≤n≤105,1≤op≤7,1≤id≤105,1≤urg≤105;
格式说明
输出时每行末尾的多余空格,不影响答案正确性
示例一
样例输入1
7
1 2 3
1 3 4
6 3
7 3
4 3 5
2
3
样例输出1
4
2
2
3
样例解释1
- 操作 1,向叫号系统内添加编号为 2 病情紧急程度为 3 的病人信息
- 操作 1,向叫号系统内添加编号为 3 病情紧急程度为 4 的病人信息
- 操作 6,编号 3 的病人的病情紧急程度为:4
- 操作 7,紧急程度为 3 的病人的编号为:2
- 操作 4, 将编号 3 的病人的病情紧急程度修改为:5
- 操作 2,当前叫号系统内的病人信息有:
- 病人信息 1, 编号:2, 病情紧急程度:3
- 病人信息 2, 编号:3, 病情紧急程度:5
- 当前最小的紧急程度为: 3
- 操作 3,当前叫号系统内的病人信息有:
- 病人信息 1, 编号:3, 病情紧急程度:5
- 当前最大的紧急程度为: 5
示例二
样例输入2
11
1 1 19
1 3 12
3
1 3 11
2
1 4 8
4 4 9
2
5 11 7
3
6 5
样例输出2
1 3
4
3
error
样例解释2
- 操作 1,向叫号系统内添加编号为 1 病情紧急程度为 19 的病人信息
- 操作 1,向叫号系统内添加编号为 3 病情紧急程度为 12 的病人信息
- 操作 3,当前叫号系统内的病人信息有:
- 病人信息 1, 编号:1, 病情紧急程度:19
- 病人信息 2, 编号:3, 病情紧急程度:12
- 当前最大的紧急程度为: 19
- 操作 1,向叫号系统内添加编号为 3 病情紧急程度为 11 的病人信息
- 操作 2,当前叫号系统内的病人信息有:
- 病人信息 1, 编号:3, 病情紧急程度:11
- 病人信息 2, 编号:3, 病情紧急程度:12
- 当前最小的紧急程度为: 11
- 操作 1,向叫号系统内添加编号为 4 病情紧急程度为 8 的病人信息
- 操作 4, 将编号 4 的病人的病情紧急程度修改为:9
- 操作 2,当前叫号系统内的病人信息有:
- 病人信息 1, 编号:4, 病情紧急程度:9
- 病人信息 2, 编号:3, 病情紧急程度:12
- 当前最小的紧急程度为: 9
- 操作 5, 将病情紧急程度 7 的病人的编号修改为:11
- 操作 3,当前叫号系统内的病人信息有:
- 病人信息 1, 编号:3, 病情紧急程度:12
- 当前最大的紧急程度为: 12
- 操作 6,当前叫号系统内没有编号为 5 的病人
解题思路
因为此题要求我们查找、更改紧急程度最小的病人,紧急程度最大的病人,编号为id的病人,经济成大为urg的病人等,所以我们可以创建一个map容器用来将编号为id与紧急程度为urg所对应地放置在容器中,并且map容器还可以自动排序,所以我们在找urg最小或urg最大的病人的id时,执教找容器中的第一个或最后一个所对应的id即可。
实现代码及注释
#include<cstdio>
#include<map>//定义一个map容器
using namespace std;
typedef long long ll;
int main()
{
map<ll,ll> a,b;
ll n,op,id,urg;
scanf("%lld",&n);
while(n--)
{
scanf("%lld",&op);//输入op
if(op==1)
{
scanf("%lld%lld",&id,&urg);
a[id]=urg;
b[urg]=id;
}
if(op==2)
{
if(b.size()==0)//若容器内长度为0
printf("error\n");//则输出error
else
{
printf("%lld\n",b.begin()->second);//输出指向容器中第一个(注意,是已排好序的第一个)所对应的value值,即urg最所对应的病人的id
a.erase(b.begin()->second);//将此病人的id删除
b.erase(b.begin());//将此病人的urg删除
}
}
if(op==3)
{
if(a.size()==0)
printf("error\n");
else
{
printf("%lld\n",(--b.end())->second);//输出指向容器中最后一个(注意,是已排好序的最后一个)所对应的value值,即urg最大所对应的病人的id
a.erase((--b.end())->second);//将此病人的id删除
b.erase(--b.end());//将此病人的urg删除
}
}
if(op==4)
{
scanf("%lld %lld",&id,&urg);
b.erase(a[id]);//将id号病人的urg值删除
a[id]=urg;//更新其urg
b[urg]=id;//将此时的urg与id相对应
}
if(op==5)
{
scanf("%lld %lld",&id,&urg);
a.erase(b[urg]);//将值为urg的病人的id删除
a[id]=urg;//将更新其id
b[urg]=id;//将其urg与id相对应
}
if(op==6)
{
scanf("%lld",&id);
if(a.find(id)==a.end())//查询编号为id的病人,若查到最后一位的后一位还是没有,则输出error
printf("error\n");
else
printf("%lld\n",a[id]);
}
if(op==7)
{
scanf("%lld",&urg);
if(b.find(urg)==b.end())//查询紧急程度为urg的病人,若查到最后一位的后一位还是没有,则输出error
printf("error\n");
else
printf("%lld\n",b[urg]);
}
}
return 0;
}