游客 Signup | Login
中文 | En

3761 - 航线

通过次数

0

提交次数

0

Time Limit : 1 秒 Memory Limit : 128 MB

Palmia 河在某国从东向西流过,并把该国分为南北两个部分。河的两岸各有 n 个城市,且北岸的每一个城市都与南岸的某个城市是友好城市,而且对应的关系是一一对应的。现在要求在两个友好城市之间建立一条航线,但由于天气的关系,所有航线都不能相交,因此,就不可能给所有的友好城市建立航线。

问题:当城市个数和友好关系建立之后,选择一种修建航线的方案,能建最多的航线而不相交。(若有多种方案,修建航线最多且城市数量相同,选择从前到后城市标号字典序小的那种方案.)

Input

输入由若干行组成,第一行有一个整数,n(1≤n≤10000);表示城市数。第2至n+1行依次是南岸城市的北岸友好城市编号。

Output

输出共两行,第一行是建立航线的数量。第二行是建立航线的北岸城市编号。

Examples

Input Format

14
13
7
9
16
38
24
37
18
44
19
21
22
63
15

Output Format

8
7 9 16 18 19 21 22 63

Solution C++

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
int i,m,n,j,a[10001],b[10001],l,jl,c[10001],t;
int main()
{
// freopen("maxxl.in","r",stdin);
// freopen("maxxl.out","w",stdout);
 cin>>n;
 for (i=1;i<=n;++i)
 {
  cin>>a[i];b[i]=1;
 }
 m=1;l=1;jl=1;
 for (i=2;i<=n;++i)
  for (j=1;j<=i-1;++j)
  {
   if (a[j]<=a[i]&&b[j]+1>b[i]) b[i]=b[j]+1;
   if (b[i]>m)
   {
	m=b[i];
	l=i;jl=i;
   }
  }
 cout<<m<<endl;
 t=1;c[1]=a[l];
 for (j=1;j<=m;++j)
  for (i=1;i<=l-1;++i)
   {
    if (a[i]<=a[jl]&&i<=jl&&b[i]==b[jl]-1)
    {
	 jl=i;
	 t+=1;c[t]=a[i];
	 break;
    }
   }
 for (i=t;i>=1;--i)
  cout<<c[i]<<" ";
// fclose(stdin);
// fclose(stdout);
 //system("pause");
 return 0;
}