cf1144G 将串分解成单调递增和递减子串(贪心)

这算哪门子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=;i<=n;i++) scanf("%lld",&num[i]);
a.push_back(mp(-,));
b.push_back(mp(N,));
for(i=;i<=n;i++)
{
if(num[i]<=a.back().fi&&num[i]>=b.back().fi)
{
puts("NO");
return ;
}
if(num[i]>a.back().fi)
{
sy[i]=;
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]=;
b.push_back(a.back());
a.pop_back();
}
if(num[i]>a.back().fi)
{
sy[i]=;
a.push_back(mp(num[i],i));
continue;
}
if(num[i]<b.back().fi)
{
sy[i]=;
b.push_back(mp(num[i],i));
continue;
}
puts("NO");
return ;
}
puts("YES");
for(i=;i<=n;i++) printf("%lld ",sy[i]);
}
上一篇:前端开发我为什么选择cordova


下一篇:JS实现控制HTML5背景音乐播放暂停