题解:
我们逆向思考,如果我们反着拿的过程中,我们没次连续拿出来的货物的价格一定是递减的。所以就是一个栈的模拟过程。
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=3e4+10;
typedef pair<int,int> pp;
vector<pp> g;
void solve()
{
int n; cin>>n;
for(int i=1;i<=n*2;i++){
char op[2];
int num;
cin>>op;
if(op[0]=='-'){
cin>>num;
g.push_back({0,num});
}else{
g.push_back({1,0});
}
}
stack<int> st1,st2;
for(int i=2*n-1;i>=0;i--){
auto u=g[i];
if(u.first==0&&(st1.empty()||(!st1.empty()&&st1.top()>u.second))){
st1.push(u.second);
}else if(u.first==1&&!st1.empty()){
st2.push(st1.top());
st1.pop();
}else{
cout<<"NO"<<'\n';
return;
}
}
if(!st1.empty()){
cout<<"NO"<<'\n';
return;
}
cout<<"YES"<<'\n';
while (!st2.empty()){
cout<<st2.top()<<' ';
st2.pop();
}
puts("");
}
signed main()
{
solve();
return 0;
}