牛客小白月赛22 A.操作序列

牛客小白月赛22 A.操作序列

题目描述

给出一个长度无限的数列,初始全部为零,有三种操作:

增加操作:给下标为 t 的数加 c 。特别注意,如果在下标 [ t 30 , t + 30 ] [t-30,t+30] 内有不为零的数,增加操作无效。
削减操作:让数列中下标最小的不为零数变为零。
查询操作:查询数列中下标为 t 的数字是多少。
输入描述:
第一行包含一个整数 N , 1 N 1 0 6 N,1 \le N \le 10^6 ,表示操作总数。
随后 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;
}
发布了296 篇原创文章 · 获赞 15 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43765333/article/details/104460350