列表

详情


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;
		}
	}
}

上一题