ICPC Pacific Northwest Regional Contest 2019 B题

用单调栈来维护,并且维护两个数组,一个是某数现存的个数,一个是这个数是否已经在栈中

如果已在栈中,就不能操作,并且把个数--,因为如果这样操作,就会出现一个问题。

题目告诉我们每个数必须出现一次,举个例子 现在是 1 3 1 4 3 2,这样的序列

刚开始是1 3 ,如果我们操作1 ,因为3的数可以有两个,因此3 这个数可以删除,这样就变成1 4 ,当我们操作3 的时候惊奇的发现4只有一个,因此不能删除,而这个并不是我们所要的答案

因此我们已经在栈中的数不能操作,其他就用单调栈维护即可,注意原则是每个数只能出现一次

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
const int mod=11092019;
int a[N];
int cnt[N];
int st[N];
int main(){
    int n,k;
    cin>>n>>k;
    int i;
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
        cnt[a[i]]++;
    }
    vector<int> num;
    for(i=1;i<=n;i++){
        if(st[a[i]]){
          cnt[a[i]]--;
          continue;
        }

        while(num.size()&&num.back()>=a[i]&&cnt[num.back()]>1){
           cnt[num.back()]--;
           st[num.back()]--;
           num.pop_back();
        }
        num.push_back(a[i]);
        st[a[i]]=1;
    }
    for(i=0;i<(int)num.size()-1;i++){
        if(num[i]){
            printf("%d ",num[i]);
        }
    }
    cout<<num[i]<<endl;
}
View Code

 

posted @ 2020-05-04 14:35  朝暮不思  阅读(244)  评论(0编辑  收藏  举报