牛客小白月赛22 A.操作序列
题目描述
给出一个长度无限的数列,初始全部为零,有三种操作:
增加操作:给下标为 t 的数加 c 。特别注意,如果在下标
内有不为零的数,增加操作无效。
削减操作:让数列中下标最小的不为零数变为零。
查询操作:查询数列中下标为 t 的数字是多少。
输入描述:
第一行包含一个整数
,表示操作总数。
随后 N 行,每行由两个数字或一个数字组成。
若一行中有两个数字,分别代表增加操作的 t,c 。
若一行中只有数字-1,执行削减操作。
若一行中只有一个不为 -1的数字,则代表查询操作的数字 t。
保证t,c均为非负整数且在整形范围内。
输出描述:
削减操作时,先输出该数字,再变为零
若序列元素全为零,则削减操作无效,此时输出 “skipped”
查询时,输出该位置上的数
示例1
输入
7
140 1
120 2
100 3
120
100
-1
100
输出
0
3
3
0
示例2
输入
4
140 3
-1
140 1
-1
输出
3
1
示例3
输入
3
-1
-1
-1
输出
skipped
skipped
skipped
看到题目第一眼的想法就是模拟,但是输入真的不知道怎么优化,我是输入字符串转数字的,过了85%,后来看了别人的代码发现了一种很好的解决输入的办法,挂出来供大家参考:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int t,id,add;
char c;
map<int,int>m;
cin>>t;
while(t--){
scanf("%d%c",&id,&c);
if(c==' '){
scanf("%d",&add);
int flag=1;
for(int i=id-30;i<=id+30;i++)
if(m.count(i)) flag=0;
if(flag) m[id]=add;
}
else if(id==-1){
if(m.empty()) puts("skipped");
else{
printf("%d\n",m.begin()->second);
m.erase(m.begin());
}
}
else{
if(m.count(id))printf("%d\n",m[id]);
else puts("0");
}
}
return 0;
}