用
8
1 4 7 9 6 2 7 8
检测到方法一错误--
方法二在本次测试中正确==
方法二还待测
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
bool fafe[100100];
int n,kk;
int shu[100100];
int kp[100100];
int hao[100100];
int chu[100100];
int zhao(int xx)
{
int l=0,r=kk-1,mid,ans=0;
while (r>=l)
{
mid=(l+r)/2;
if (kp[mid]>=xx)
{
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
return ans;
}
int main()
{
while (~scanf("%d",&n))
{
kk=0;
memset(kp,0x3f3f3f,sizeof(kp));
memset(hao,0,sizeof(hao));
memset(fafe,false,sizeof(fafe));
for (int i=0;i<n;i++)
{
scanf("%d",&shu[i]);
if (kk)
{
if (shu[i]>kp[kk-1])
{
chu[kk]=shu[i];
hao[kk]=i;
kp[kk++]=shu[i];
int op=kk-2;
/*while (fafe[op])//一
{
chu[op]=kp[op];
fafe[op]=false;
if (op)
op--;
}*/
/*while (fafe[op]&&hao[op]<hao[op+1])//二
{
printf("%d %d %d\n",op,kp[op],chu[op+1]);
chu[op]=kp[op];
fafe[op]=false;
if (op)
op--;
}*/
}
else
{
int oppo=zhao(shu[i]);
fafe[oppo]=true;
hao[oppo]=i;
kp[oppo]=shu[i];
}
}
else
{
chu[kk]=shu[i];
hao[kk]=i;
kp[kk++]=shu[i];
}
}
printf("%d\n",kk);
for (int i=0;i<kk;i++)
printf("%d ",chu[i]);
}
return 0;
}