K-Stack(2021牛客暑期多校2)

题目传送门

分析: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;
}
原文地址:https://www.cnblogs.com/GUOGaby/p/15036966.html