题目描述
小明最近喜欢上数组统计,但是他遇到了一道难题,题目如下:
最初数列是空的,那么一共有下面五种操作:
a x 表示向数列里面增加数值为x的数;
d x 表示删除数列里面数值为x的数;
I 表示删除数列里面数值最大的数;
m 表示删除数列里面数值最小的数;
q 询问当前数列的和。
保证添加的元素都不不一样,对于删除操作,如果数列里面不存在这个元素,则不进行删除操作。小明不会做这个题,希望寻求你的帮助,聪明的你可以帮助小明解决这个问题吗?
在处理输入的时候要特别注意!题目中操作 3 的操作字符是 大写的 i,而不是小写的 l。
输入格式
第一行输入两个数n,表示操作的数目;
之后n行,每行为题目中描述的五种操作。
输出格式
对于每个询问,输出当前数列的和。
样例
【样例输入】
11 a 1 d 2 q a 2 a 3 a 4 q I q m q【样例输出】
1 10 6 5数据范围与提示
样例解释
a 1 增加1到数列里面
d 2 删除数列里面数值为2的元素,因为数列里面没有,所以不进行操作
q 询问,当前数列的和为1
a 2 增加2到数列里面
a 3 增加3到数列里面
a 4 增加4到数列里面
q 询问,当前数列的和为10
I 删除数列里面数值最大的元素,删除4
q 询问,当前数列的和为6
m 删除数列里面数值最小的元素,删除1
q 询问,当前数列的和为5
数据范围
1<=n<=100000
1<=x<=100000且x互不相同
一些想法
在最前面先定义一个关于 set 的迭代器 it,以便后面使用,循环输入字符,然后判断如果字符是‘a’,再输入一个数,在 set 中插入这个数。如果是‘d’,寻找 输入的数 如果不等于最后一个数的后面(就是如果这个数存在 set 中),删除这个数。如果等于 I,it 等于 --end(),就是等于最后一个数(正序排序后的最后一个数,也就是最大的数),如果 set 不为空,删除 it。如果等于‘m’,it等于第一个数(也就是最小的数),如果队列不为空,删除这个数。如果等于‘q’,用迭代器遍历 set,加上每一个数(set所有数之和),输出,换行。
AC代码
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin>>n; set<int> s; set<int>::iterator it; for(int i=1;i<=n;i++){ char a; cin>>a; if(a=='a'){ int d; cin>>d; s.insert(d); } if(a=='d'){ int d; cin>>d; if(s.find(d)!=s.end()) s.erase(d); } if(a=='I'){ it=--s.end(); if(!s.empty()) s.erase(it); } if(a=='m'){ it=s.begin(); if(!s.empty()) s.erase(it); } if(a=='q'){ int sum=0; for(it=s.begin();it!=s.end();it++){ sum+=*it; } cout<<sum<<endl; } } return 0; }