您的位置:首页 > 其它

LIS之贪心加二分,,求最大长---记录路径(待检验--欢迎提供数据)

2016-07-25 09:40 447 查看


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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: