NC202474. 操作序列
描述
给出一个长度无限的数列,初始全部为零,有三种操作:
输入描述
第一行包含一个整数 ,表示操作总数。随后 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
pypy3(pypy3.6.1) 解法, 执行用时: 6276ms, 内存消耗: 33208K, 提交时间: 2020-02-22 21:09:54
from queue import PriorityQueue pq=PriorityQueue() mp={} T=int(input()) for k in range(T): s=input().split() if(len(s)==1): tmp=int(s[0]) if tmp==-1: if len(mp)==0: print("skipped") else: kk=pq.get() print(mp[kk]) mp.pop(kk) else: if tmp in mp.keys(): print(mp[tmp]) else: print(0) else: tmp1=int(s[0]) tmp2=int(s[1]) flg=0 for i in range(tmp1-30,tmp1+31): if i in mp.keys(): flg=1 break if flg==0: if tmp1 in mp.keys(): mp[tmp1] += tmp2 else: mp[tmp1]=tmp2 pq.put(tmp1)
C++11(clang++ 3.9) 解法, 执行用时: 282ms, 内存消耗: 8312K, 提交时间: 2020-04-22 16:26:36
#include <bits/stdc++.h> using namespace std; int n; map<int, int> mp; int main(){ scanf("%d", &n); while(n--){ int p, x; scanf("%d", &p); if(getchar() == '\n'){ if(~p) mp.count(p) ? printf("%d\n", mp[p]) : puts("0"); else{ if(mp.size()) printf("%d\n", mp.begin()->second), mp.erase(mp.begin()); else puts("skipped"); } } else{ scanf("%d", &x); auto pos = mp.lower_bound(p - 30); if(pos == mp.end() || pos->first > p + 30) mp[p] = x; } } }
C++14(g++5.4) 解法, 执行用时: 301ms, 内存消耗: 2012K, 提交时间: 2020-02-24 17:04:57
#include<cstdio> #include<map> using namespace std; map<int,int> a; int main(){ int n; scanf("%d",&n); for (int t,c;n;n--){ scanf("%d",&t); if (getchar()=='\n'){ if (t==-1){ if (a.empty()) puts("skipped"); else printf("%d\n",a.begin()->second),a.erase(a.begin()); } else { if (a.count(t)) printf("%d\n",a[t]); else puts("0"); } }else{ scanf("%d",&c); auto pos=a.lower_bound(t-30); if (pos==a.end() || pos->first>t+30) a[t]=c; } } }