1. 程式人生 > 其它 >K-Stack(2021牛客暑期多校2)

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;
}