题意:从一个数组中提取出一个严格升序和一个严格降序的序列,可行输出方案
题解思路:
维护一个升序序列,一个降序序列,如果只满足其中一个,就插入,如果都不满足就输出no
如果两个都满足,需要比较和下一个的大小关系:
贪心思路就是尽量保持降序的最小值最大,保持升序的最大值最小
很巧妙的贪心思路
#include<bits/stdc++.h>
using namespace std;
const int mod=(int)1e9+7;
const int inf = 0x3f3f3f3f;
const int mx = int(500) ;
const int maxn=(int)2e5+5;
#define ll long long
int a[maxn];
vector<int>in;
vector<int>de;
int vis[maxn];
int main()
{
//cout<<inf<<endl;
memset(vis,-1,sizeof(vis));
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
if(a[1]>=a[2])
{
de.push_back(a[1]);
in.push_back(-1);
vis[1]=1;
}
else
{
de.push_back(inf);
in.push_back(a[1]);
vis[1]=0;
}
for(int i=2;i<=n;i++)
{
if(a[i]<de.back()&&a[i]<=in.back())//只能放de
{
de.push_back(a[i]);
vis[i]=1;
}
else if(a[i]>=de.back()&&a[i]>in.back())
{
in.push_back(a[i]);
vis[i]=0;
}
else if(a[i]<de.back()&&a[i]>in.back())
{
if(i==n)
{
vis[i]=1;
}
else
{
if(a[i]>a[i+1])
{
de.push_back(a[i]);
vis[i]=1;
}
else if(a[i]<a[i+1])
{
in.push_back(a[i]);
vis[i]=0;
}
else if(a[i]==a[i+1])
{
vis[i]=1;vis[i+1]=0;
de.push_back(a[i++]);
in.push_back(a[i]);
}
}
}
else
{
//cout<<"de"<<de.back()<<endl;
cout<<"NO"<<endl;
return 0;
}
}
for(int i=1;i<=n;i++)
{
if(vis[i]==-1)
{
cout<<"NO"<<endl;
return 0;
}
}
cout<<"YES"<<endl;
for(int i=1;i<=n;i++)
{
cout<<vis[i]<< ' ';
}cout<<endl;
return 0;
}
dp思路待补