这题操作次数不超过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; }