https://www.51nod.com/Challenge/Problem.html#!#problemId=1403
画个图就会发现 pop就是左括号 push就是右括号 push和pop构成一个合法括号序列
题中给的第二种序列显然是左括号的前缀和 第一种就是每个右括号的对应左括号在该右括号的左边多远
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define pb push_back
const int maxn=1e6+10;
vector <int> pre;
int ary[maxn],book[2*maxn];
int n;
template <class T>
inline void _cin(T &ret)
{
char c;
ret = 0;
while((c = getchar()) < '0' || c > '9');
while(c >= '0' && c <= '9'){
ret = ret * 10 + (c - '0');
c = getchar();
}
}
int main()
{
int i,j;
//scanf("%d",&n);
_cin(n);
for(i=1;i<=n;i++){
//scanf("%d",&ary[i]);
_cin(ary[i]);
}
j=2*n;
for(i=n;i>=1;i--){
while(book[j]) j--;
pre.pb(j);
book[j-2*ary[i]-1]=1;
j--;
}
for(i=1;i<=2*n;i++){
book[i]+=book[i-1];
}
for(i=n-1;i>=0;i--){
printf("%d",book[pre[i]]);
if(i>0) printf(" ");
else printf("\n");
}
return 0;
}