每天,农夫约翰的 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 secondusing 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;}
