操作序列(STL map)

与世无争的帅哥 提交于 2020-03-21 05:59:47

 

链接:https://ac.nowcoder.com/acm/contest/4462/A
来源:牛客网

题目描述

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

  • 增加操作:给下标为 t 的数加 c 。特别注意,如果在下标 [t−30,t+30] 内有不为零的数,增加操作无效。
  • 削减操作:让数列中下标最小的不为零数变为零。
  • 查询操作:查询数列中下标为 t 的数字是多少。

输入描述:

第一行包含一个整数 N,1≤N≤106,表示操作总数。
随后 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

 

 

 1 #include <bits/stdc++.h>
 2 typedef long long LL;
 3 const int INF=0x3f3f3f3f;
 4 const double eps =1e-8;
 5 const int mod=1e9+7;
 6 const int maxn=1e5+10;
 7 using namespace std;
 8 
 9 map<LL,LL> mp;
10 
11 int main()
12 {
13     #ifdef DEBUG
14     freopen("sample.txt","r",stdin);
15     #endif
16     
17     int n;
18     scanf("%d",&n);
19     while(n--)
20     {
21         LL a,b;
22         scanf("%lld",&a);
23         if(getchar()=='\n')
24         {
25             if(a==-1)
26             {
27                 if(mp.empty()) printf("skipped\n");
28                 else printf("%lld\n",mp.begin()->second), mp.erase(mp.begin());
29             }
30             else
31             {
32                 if(mp.count(a)) printf("%lld\n",mp[a]);
33                 else printf("0\n");
34             }
35         }
36         else
37         {
38             scanf("%lld",&b);
39             auto pos=mp.lower_bound(a-30);
40             if(pos==mp.end() || pos->first > a+30) mp[a]+=b;
41         }
42     }
43     
44     return 0;
45 }

 

 

 

 

 

 

-

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!