K-Stack(2021牛客暑期多校2)
阿新 • • 發佈:2021-07-20
分析:bi就是已知加入ai以後以ai結尾的LIS。
先貪心地把它給的不完整的資訊弄完整:
因為不合法的情況是這次的棧的容量減上次的>1個,那麼這個位置就填入pos【i-1】+1,減少不合法的可能性。
再考慮原序列,因為是遞增的構造法,那麼在容量最大的位置填入最大的數,然後如果bi,bj相同(i<j),ai一定大於aj,不然bj=bi+1。
code:
#include<bits/stdc++.h> #define N 1000007 using namespace std; int val[N],L[N],R[N],pos[N],ans[N]; vector<int>v[N]; int main(){ int n,k; cin>>n>>k; for(int i=1;i<=k;i++){ int p,x; scanf("%d%d",&p,&x); pos[p]=x; } for(int i=1;i<=n;i++){ if(pos[i]){ if(pos[i]-pos[i-1]>1){ cout<<-1; return 0; } } else pos[i]=pos[i-1]+1; v[pos[i]].push_back(i); } int as=n; for(int i=n;i;i--){ int sz=v[i].size(); for(int j=0;j<sz;j++){ ans[v[i][j]]=as--; } } for(int i=1;i<=n;i++)printf("%d ",ans[i]); return 0; }