Description
Input
Output
Sample Input
Sample1:
3
1 2 3
Sample2:
9
1 3 2 4 8 6 9 5 7
Sample Output
Sample1:
3
Sample2:
5
Data Constraint
Solution
显然,一辆列车开到另一辆列车的后面,一定比新开一条轨道更优。
那么一辆列车要满足什么条件才能停到另一辆的后面呢?
它的序号 X 一定小于前面的列车!不然其他就出不去、无法满足题意了。
于是我们贪心地寻找比
X 大的值且最小的那个位置,停进去即可。其实我们不需要模拟开出的情况,因为操作是序号更小时才会进行的。
那么当某个序号的列车将要开出时,它的前面一定没有阻挡的列车,因为它们已经开出了。
于是我们只需用一个 Set 维护一下轨道最后一个列车的序号的情况,直接处理即可。
这样的时间复杂度是 O(NlogN) 。
Code
#include<cstdio>
#include<set>
using namespace std;
inline int read()
{
int X=0,w=1; char ch=0;
while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
return X*w;
}
set<int>f;
int main()
{
int n=read(),ans=0;
for(int i=1;i<=n;i++)
{
int x=read();
f.insert(x);
set<int>::iterator it=f.find(x);
if(++it==f.end()) ans++; else f.erase(it);
}
printf("%d",ans);
return 0;
}