看完题解才发现其实就是二分图匹配,好巧妙。。。。
被学弟秀了一脸
#include <bits/stdc++.h> using namespace std; int a[100005]; vector<int> ans; vector<char> now; stack<int> x,y;int cnt=1; int n;bool flag; bool check(int pos){ if(y.empty()) return true; int i; for(i=pos+1;i<=n;i++) if(a[i]>a[pos]&&a[i]>y.top()) break; for(int j=i+1;j<=n;j++) if(a[j]<a[pos]) return false; return true; } void solve(){ for(int i=1;i<=n*2;i++){ flag=false; if((x.empty()||x.top()>a[cnt])&&cnt<=n&&check(cnt)){ x.push(a[cnt]); flag=true; cnt++; now.push_back('a'); } else if(!x.empty()&&ans.back()+1==x.top()){ ans.push_back(x.top()); x.pop(); flag=true; now.push_back('b'); } else if((y.empty()||y.top()>a[cnt])&&cnt<=n){ y.push(a[cnt]); flag=true; cnt++; now.push_back('c'); } else if(!y.empty()&&ans.back()+1==y.top()){ ans.push_back(y.top()); y.pop(); flag=true; now.push_back('d'); } if(!flag) break; } } int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; cnt=1; ans.push_back(0); solve(); if(!flag) cout<<0<<endl; else for(auto it : now) cout<<it<<" "; return 0; }