每天,农夫约翰的 NN 头奶牛都会穿过农场中间的马路。
考虑约翰的农场在二维平面的地图,马路沿水平方向延伸,马路的一侧由直线 y=0y=0 描述,另一侧由直线 y=1y=1 描述。
奶牛 ii 从马路一侧的位置 (ai,0)(ai,0) 沿直线过马路到达另一侧的位置 (bi,1)(bi,1)。
所有 aiai 互不相同,所有 bibi 互不相同。
尽管他的奶牛们行动敏捷,他还是担心行动路径交叉的两头奶牛在过马路时发生碰撞。
约翰认为,如果一头奶牛的行动路径没有跟其他任何奶牛的行动路径相交,则该奶牛是安全的。
请帮助约翰计算安全奶牛的数量。
输入格式
第一行包含整数 NN。
接下来 NN 行,每行包含两个整数 ai,biai,bi,用来描述一头牛的行动路径。
输出格式
数据范围
1≤N≤1051≤N≤105,
−106≤ai,bi≤106−106≤ai,bi≤106
输入样例:
输出样例:
样例解释
第一头牛和第三头牛的行动路线不与其他奶牛的路线相交。
第二头牛和第四头牛的行动路线相交。
#include <iostream>
#include <algorithm>
#include <cstring>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N = 100010, INF = 1e8;
int n;
PII q[N];
int smax[N],smin[N];
int main() {
cin >> n;
for (int i = 1; i <= n; ++i) cin >> q[i].x >> q[i].y;
//排序
sort(q+1,q+n+1);
smax[0] = -INF, smin[n+1] = INF;
//最大前缀值,最小前缀值
for (int i = 1; i <= n; ++i) smax[i] = max(smax[i-1],q[i].y);
for (int i = n; i > 0; --i) smin[i] = min(smin[i+1],q[i].y);
int res = 0;
for (int i = 1; i <= n; ++i)
if (q[i].y > smax[i-1] && q[i].y < smin[i+1])
res++;
cout << res << endl;
return 0;
}