zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    VS2010开发C的方法
    Activity.startManagingCursor方法
    application/xwwwformurlencoded、multipart/formdata、text/plain
    TCP三次握手/四次挥手详解
    hdu 2157 How many ways??
    zoj 2475 Benny's Compiler
    zoj 2744 Palindromes
    zoj 2750 Idiomatic Phrases Game
    zoj 2104 Let the Balloon Rise
    flash:学习ActionScript的一些提示
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12826505.html
Copyright © 2011-2022 走看看