牛客小白月赛22 - 操作序列(STL map)
链接:https://ac.nowcoder.com/acm/contest/4462/A
来源:牛客网
时间限制:C/C++ 5秒,其他语言10秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
给出一个长度无限的数列,初始全部为零,有三种操作:
- 增加操作:给下标为 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 }
-