分析: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;
}