必须要⻋号⼤的先出,⼩的后出。所以列⻋排队的每⼀队必须是从⼤到⼩排列(从右往左
看),才能保证开出去的⻋也是从⼤到⼩的。
对于每⼀个想要进⼊并列铁轨的⻋,如果⻋号⼤于每⼀ 队的队尾的⻋号,说明不能进⼊已经有的队伍,必须进⼊新的铁轨,否则,选择⼀个最接近它⻋号的 尾部⻋号的队伍进⼊。
其实⽆需保存每⼀个并⾏队列的所有值,只需要保存当前队伍的⻋尾(就是每 ⼀列最左边 即 每⼀列的最⼩值)即可,因为每⼀次都是需要排序⽐较⼤⼩的,所以⽤ 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<bits/stdc++.h>
#include<set>
#include<vector>
using namespace std;
int main()
{
int n;
cin>>n;
set<int>s;
s.insert(0);
for(int i=0;i<n;i++)
{
int x;
cin>>x;
if(x<*s.rbegin())
{
s.insert(x);
s.erase(s.upper_bound(x));
}
s.insert(x);
}
cout<<s.size()-1;
return 0;
}
注意:
c.begin() 返回一个迭代器,它指向容器c的第一个元素
c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置
c.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素
c.rend() 返回一个逆序迭代器,它指向容器c的第一个元素前面的位置