481 - What Goes Up
需要用到NlogN的LIS
1 #include <cstdio>
2 #include <iostream>
3 #include <cstring>
4 #include <vector>
5 #include <algorithm>
6
7 using namespace std;
8
9 int f[65535];
10 int from[65535];
11 vector<int> row;
12 int flag1,flag2;
13 int temp[65535];
14 int ans = 0;
15 vector<int> v;
16
17 int max(int a,int b)
18 {
19 return a>b?a:b;
20 }
21
22 //const int N = 1001;
23 // f[i]用于记录a[0...i]的最大长度
24 /*
25 int bsearch(const int *C, int size, const int &a)
26
27 {
28
29 int l=0, r=size-1;
30
31 while( l <= r )
32
33 {
34
35 int mid = (l+r)/2;
36
37 if( a > C[mid-1] && a < C[mid] ) return mid; // >&&<= 换为: >= && <
38
39 else if( a < C[mid] ) r = mid-1;
40
41 else l = mid+1;
42
43 }
44
45 }
46
47 int C[65535];
48
49 int LIS(const int *a, const int &n){
50
51 int i, j, size = 1;
52
53 C[0] = a[0]; f[0] = 1;
54
55 for( i=1; i < n; ++i ){
56
57 if( a[i] < C[0] ) j = 0; // <= 换为: <
58
59 else if( a[i] >= C[size-1] ) j = size++; // > 换为: >=
60
61 else j = bsearch(C, size, a[i]);
62
63 C[j] = a[i]; f[i] = j+1;
64 }
65
66 return size;
67
68 }
69 */
70
71 int bsearch(int &a)
72 {
73 int l = 0;
74 int r = v.size()-1;
75 int m;
76 while(l<=r)
77 {
78 m = (l+r)/2;
79 if (v[m]<a) l= m+1;
80 else r=m-1;
81 }
82 v[l] = a;
83 return l;
84 }
85
86 int LIS(vector<int>& s)
87 {
88 if (s.size() == 0) return 0;
89
90 v.push_back(s[0]);
91
92 f[0] = 1;
93
94 for (int i = 1; i < s.size(); ++i)
95 {
96 int n = s[i];
97
98 if (n > v.back())
99 {
100 v.push_back(n);
101 f[i] = v.size();
102 }
103 else
104 {
105 f[i] = bsearch(n)+1;
106 }
107 }
108 return v.size();
109 }
110 int main()
111 {
112 //freopen("ex.in","r",stdin);
113 int len=0;
114 int temps;
115 for(; cin>>temps;)
116 {
117
118 row.push_back(temps);
119 len++;
120 }
121 ans = LIS(row);
122 flag1 = ans;
123 vector<int> lis;
124 for (int i = row.size()-1;i>=0;i--)
125 {
126 if (f[i] == flag1)
127 {
128 flag1--;
129 lis.push_back(row[i]);
130 }
131 if (flag1 == 0)
132 break;
133 }
134 cout<<ans<<endl<<"-"<<endl;
135 for (int i=lis.size()-1;i>=0;i--)
136 cout<<lis[i]<<endl;
137 return 0;
138 }
posted on 2011-08-02 19:39 cherryunix 阅读(197) 评论(0) 收藏 举报
浙公网安备 33010602011771号