有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右。游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼。从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右)。问足够长的时间之后,能剩下多少条鱼?
Input
第1行:1个数N,表示鱼的数量(1 <= N <= 100000)。 第2 - N + 1行:每行两个数A[i], B[i],中间用空格分隔,分别表示鱼的大小及游动的方向(1 <= A[i] <= 10^9,B[i] = 0 或 1,0表示向左,1表示向右)。
Output
输出1个数,表示最终剩下的鱼的数量。
Input示例
5 4 0 3 1 2 0 1 0 5 0
Output示例
2
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
struct Node
{
int val;
int dir;
Node *next;
Node(int v, int d)
{
val = v;
dir = d;
next = NULL;
}
};
int A[100000];
int B[100000];
int fun(int n)
{
Node *head = new Node(0, 0);
Node *p = head;
for (int i = 0; i < n; i++)
{
p = head;
while (p->next != NULL)
{
if ((B[i] == 1) || (p->next->dir == 0))
{
Node *q = new Node(A[i], B[i]);
q->next = p->next;
p->next = q;
break;
}
else
{
if (A[i] < p->next->val)
{
break;
}
else if (A[i] > p->next->val)
{
Node *temp = p->next->next;
delete p->next;
p->next = temp;
}
else
{
p = p->next;
}
}
}
if (p->next == NULL)
{
p->next = new Node(A[i], B[i]);
}
}
int result = 0;
p = head->next;
while (p != NULL)
{
result++;
Node *temp = p;
p = p->next;
delete temp;
}
delete head;
return result;
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> A[i] >> B[i];
}
cout << fun(n) << endl;
return 0;
}