码迷,mamicode.com
首页 > 其他好文 > 详细

ICPC Pacific Northwest Regional Contest 2019 B题

时间:2020-05-04 15:08:06      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:continue   reg   def   bit   pop   注意   display   icpc   alt   

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

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

题目告诉我们每个数必须出现一次,举个例子 现在是 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

 

ICPC Pacific Northwest Regional Contest 2019 B题

标签:continue   reg   def   bit   pop   注意   display   icpc   alt   

原文地址:https://www.cnblogs.com/ctyakwf/p/12826505.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!