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