单点时限: 2.0 sec
内存限制: 256 MB
水平线上有 N 只蚂蚁,每只蚂蚁的位置及大小均不同。他们沿着 X 轴爬行,有的向左,有的向右,爬行的速度是一样的,两只蚂蚁相遇大一点的会吃掉小的。
现在从左到右给出每只蚂蚁的大小和爬行的方向(0 表示向左,1 表示向右)。问足够长的时间之后,能剩下多少只蚂蚁?
输入格式
第 1 行:一个整数 N,表示蚂蚁的数量 (1≤N≤105)。
第 2 到 N+1 行:每行两个数 Ai,Bi (1≤Ai≤109,Bi∈{0,1}),中间用空格分隔,分别表示蚂蚁的大小及爬
行的方向,Bi=0 表示向左,Bi=1 表示向右。
对于 3/8 的数据,存在 x 满足:所有坐标比 x 小的蚂蚁向左爬、坐标比 x 大的蚂蚁向右爬;或者所有坐标比 x 小的蚂蚁向右爬、坐标比 x 大的蚂蚁向左爬。
输出格式
输出最终剩下的蚂蚁的数量。
样例
input
5
4 0
3 1
2 0
1 0
5 0
output
2
/*
思路:往一个方向走的都会留下来,遇到不同方向时会有减少。用栈保存往右走的,遇到往左走的,与栈内元素比较,小的淘汰,大的保留。
*/
#include<iostream>
#include<stack>
using namespace std;
struct g {
long long data;
int flag;
} ;
int main() {
int n;
cin>>n;
g G[n];
long long ans=0;
int q=0;
long long index=0;
for(int i = 0; i < n; i++) {
long long data;
int flag;
cin>>data>>flag;
if(flag==0&&q==0)
ans++;
else {
G[index].data=data;
G[index++].flag=flag;
q=1;
}
}
stack<g>p;
for(int i = 0; i < index; i++) {
if(G[i].flag==1)
p.push(G[i]);
else {
while(!p.empty()) {
g f = p.top();
if(f.data<G[i].data)
p.pop();
else {
if(f.data==G[i].data)
ans++;
break;
}
}
if(p.empty())
ans++;
}
}
cout<<ans+p.size();
return 0;
}