这算哪门子dp..
具体做法就是贪心,建立两个vector存递增序列递减序列,操作过程中a可以合法地匀一个给b
就是判断第i个数放在递增序列里还是放在递减序列里,需要根据后面的数来进行决策
#include<bits/stdc++.h> #define ll long long #define P pair<ll,ll> #define mp make_pair #define fi first #define se second #define N 200100 using namespace std; ll n,m,num[N],sy[N]; vector<P>a,b; int main() { ll i,j,p,q; cin>>n; for(i=1;i<=n;i++) scanf("%lld",&num[i]); a.push_back(mp(-1,0)); b.push_back(mp(N,0)); for(i=1;i<=n;i++) { if(num[i]<=a.back().fi&&num[i]>=b.back().fi) { puts("NO"); return 0; } if(num[i]>a.back().fi) { sy[i]=0; a.push_back(mp(num[i],i)); continue; } if(a.back().fi<b.back().fi&&a.back().se>b.back().se) { sy[a.back().se]=1; b.push_back(a.back()); a.pop_back(); } if(num[i]>a.back().fi) { sy[i]=0; a.push_back(mp(num[i],i)); continue; } if(num[i]<b.back().fi) { sy[i]=1; b.push_back(mp(num[i],i)); continue; } puts("NO"); return 0; } puts("YES"); for(i=1;i<=n;i++) printf("%lld ",sy[i]); }