这个题 由于没想到位,离AC只差一步。最终还是没写出来。
众所周知,sort()默认按递增排序一样,upper_bound()默认用于非严格递增序列。sort函数第三个参数可以重载运算符,只需sort(a,a+n,greater()),这样作用数组就从大到小排序。upper_bound也一样,加上第四个参数greater()之后,就说明,要操作的数组现在是非严格递减的。
接下来说题目:给出一个长度为 N 的整数序列:A = { A1, A2, …, AN }。对于每个数,我们都涂上一种颜色,要求:如果 Ai 与 Aj (i < j) 颜色相同,则要保证 Ai < Aj。问最少需要多少种颜色。
显然,题目就是问你最少能分成几个严格递增子序列。我们可以把子序列看成一个个队伍。而且因为是单调递增的,只需记录这个队伍的最后一个元素即可,因此可以用一维数组模拟。t[i]表示第i支队伍的最后一个元素。我们每次只需遍历每支队伍(为了保证效率,必须使用二分查找),看是否有队伍的最后一个元素比当前要压入队伍的元素小,有的话更新这个尾巴,没有的话新建一个队伍即可。最后看新建的几个队伍。
int p[100100];
int t[100010], ct = 1;
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> p[i];
for (int i = 1; i <= n; i++)
{
int temp = upper_bound(t + 1, t + ct, p[i], greater<int>()) - t;
if (temp == ct)
t[ct++] = p[i];
else
t[temp] = p[i];
}
cout << ct - 1 << endl;
return 0;
}