这题操作次数不超过100000,是可以用一个vis数组记录各个编号是否存在的。但是如果操作数达到一个数组存不下的天文数字,就得用其他办法了。我这里采用用set容器存可以新建的编号,可能可以为离散化提供一点思路。代码注释比较详细。
#include<bits/stdc++.h>
using namespace std;
set<int>s;//保留可以新建的编号(与已有文件编号不重复的最小正整数作为新文档的编号)
int n,num;//n是操作数,num是要删除的编号
char order[10];//记录是New还是Delete、
int main(){
scanf("%d",&n);
s.insert(1);//第一个新建的编号是1,初始化set
while(n--){
scanf("%s",order);
//执行New操作
if(order[0] == 'N') {
printf("%d\n",*(s.begin()));//直接输出(即新建)set容器中第一个编号(即最小且不重复的第一个数)
if((int)s.size() == 1) s.insert(*(s.begin())+1);
//如果set只有一个编号,肯定是未进行过删除或者删除后已经填完坑了,所以下一个编号就是这个编号加一
s.erase(s.begin());//在set删除当前编号(已新建的编号)
}
//执行Delete操作
else {
scanf("%d",&num);
//如果要删除的编号num大于已新建的最大编号 或者 在set中存在num(说明已经被删除过了),删除失败
if(*(--s.end())<=num||s.find(num) != s.end()) printf("Failed\n");
else {
printf("Successful\n");//删除成功
s.insert(num);//放入可以新建编号的set容器中
}
}
}
return 0;
}
京公网安备 11010502036488号