思路

暴力能过,只不过新加入文档编号cnt不能每次都从1数起,而是要从min(cnt++,x)数起(x为删除文档的最小编号)
我最终的做法用了优先队列,如果前面的编号被清除了,就往里面加(空间是够用的)。
虽然有点多此一举,但事实证明确实会快一点,下面贴两份代码。

优先队列代码

#include<bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,cnt=0,x,a[100050];
    string str;
    priority_queue<int,vector<int> ,greater<int> >can;
    cin>>n;
    memset(a,0,sizeof(a));
    for(int i=1;i<=n;i++){
        cin>>str;
        if(str=="New"){
            if(!can.empty()){
                x=can.top();
                a[x]=1;
                cout<<x<<endl;
                can.pop();
            }else{
                a[++cnt]=1;
                cout<<cnt<<endl;
            }
        }
        if(str=="Delete"){
            cin>>x;
            if(a[x]){
                cout<<"Successful"<<endl;
                a[x]=0;
                can.push(x);
            }else{
                cout<<"Failed"<<endl;
            }
        }
    }
    return 0;
}

暴力代码

#include<bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,cnt=1,x,a[100005];
    string str;
    cin>>n;
    memset(a,0,sizeof(a));
    for(int i=1;i<=n;i++){
        cin>>str;
        if(str=="New"){
            while(a[cnt]) cnt++;
            a[cnt]=1;
            cout<<cnt<<endl;
        }
        if(str=="Delete"){
            cin>>x;
            if(a[x]){
                cout<<"Successful"<<endl;
                a[x]=0;
                cnt=min(cnt,x);
            }else{
                cout<<"Failed"<<endl;
            }
        }
    }
    return 0;
}