题目大意:给你一系列数,找出它的最长(严格)递增子序列。
由于数据量较大,使用O(n2)的LIS算法会超时,要使用O(nlogn)的LIS算法,有详细的介绍。
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 typedef vector vi; 7 8 vi v, temp, pos, ans; 9 10 int main()11 {12 #ifdef LOCAL13 freopen("in", "r", stdin);14 #endif15 int x;16 while (scanf("%d", &x) != EOF)17 v.push_back(x);18 temp.push_back(v[0]);19 pos.push_back(1);20 for (int i = 1; i < v.size(); i++)21 {22 x = v[i];23 if (x > temp.back())24 {25 temp.push_back(x);26 pos.push_back(temp.size());27 }28 else29 {30 vi::iterator it = lower_bound(temp.begin(), temp.end(), x);31 *it = x;32 pos.push_back(it-temp.begin()+1);33 }34 }35 for (int p = pos.size()-1, len = temp.size(); p >=0 && len > 0; p--)36 if (pos[p] == len)37 {38 ans.push_back(v[p]);39 len--;40 }41 cout << ans.size() << endl << '-' << endl;42 for (int i = ans.size()-1; i >= 0; i--)43 cout << ans[i] << endl;44 return 0;45 }