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; }
没有人不辛苦,只有人不喊疼