没想法....
参考柳婼
必须要⻋号⼤的先出,⼩的后出。所以列⻋排队的每⼀队必须是从⼤到⼩排列(从右往左看),才能保证开出去的⻋也是从⼤到⼩的。对于每⼀个想要进⼊并列铁轨的⻋,如果⻋号⼤于每⼀ 队的队尾的⻋号,说明不能进⼊已经有的队伍,必须进⼊新的铁轨,否则,选择⼀个最接近它⻋号的 尾部⻋号的队伍进⼊。其实⽆需保存每⼀个并⾏队列的所有值,只需要保存当前队伍的⻋尾(就是每 ⼀列最左边 即 每⼀列的最⼩值)即可,因为每⼀次都是需要排序⽐较⼤⼩的,所以⽤ set ⾃动排序, ⾸先把 set ⾥⾯放⼊⼀个 0 值。每⼀次 set 的最后⼀个值 s.rbegin() 都是当前所有队列队尾的最⼤值。如 果当前想要进⼊排队队伍的 t 值⽐集合⾥⾯最⼤值⼩,就移除第⼀个⽐他⼤的值,然后把 t 插⼊集合 中。表示的是将 t 值插⼊了最接近它⻋号的队伍的队尾,否则就直接插⼊进去 t 值。作为新的队伍。s.upper_bound(t) 返回的是第⼀个⼤于 t 的迭代器的位置,在前⾯加星号表示取这个位置的值,所以 s.erase(*(s.upper_bound(t))); 表示删除当前这个刚好⼤于 t 的位置处的值。因为⼀开始插⼊了⼀个没有的 0 ,所以最后输出是 s.size()-1;
#include <iostream>
#include <set>
using namespace std;
int main() {
int n, t;
cin >> n;
set<int> s;
s.insert(0);
for(int i = 0; i < n; i++) {
cin >> t;
if(t < *s.rbegin()) {
s.erase(*(s.upper_bound(t)));
}
s.insert(t);
}
cout << s.size() - 1;
return 0;
}