3264. 蚂蚁

单点时限: 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值