Description
由于经济紧张,某国国王决定减少一部分多余的士兵,这些士兵在边界都有各自的管辖范围。例如,士兵x 的管辖范围[ax,bx]。我们定义:对于i号士兵,如果存在j号士兵的管辖范围[aj,bj], aji且bij成立,那么i号士兵就是多余的。给出多个士兵的管辖范围,问有多少个士兵是多余的?
Input
有多组数据,每组数据的第一行为一个整数n(1<=n<=100000),下面n行每行包含两个整数ai,bi,代表i号士兵的管辖范围(0<=aii<=200000)。所有的ai是不同的,bi也是不同的。
Output
输出多余士兵的个数。
Sample Input
5 0 10 2 9 3 8 1 15 6 11
Sample Output
3
题目大意:可用尺取法,对前坐标或者后坐标进行排序,固定一边,比较另一边(可以确定排序的一边不会违反题目要求),遇到小的加一,大的更新。
代码如下:
#include <iostream>
#include <algorithm>
#include <math.h>
#include <stdio.h>
using namespace std;
struct qaq
{
int a;
int b;
}s[200001];
int cmp(struct qaq p,struct qaq q)
{
if(p.a==q.a)
return p.b>q.b;
return p.a<q.a;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int c[200001]= {0};
for(int i=0; i<n; i++)
scanf("%d%d",&s[i].a,&s[i].b);
int ss=0,k=0;
sort(s,s+n,cmp);
for(int i=1; i<n; i++)
{
if(s[k].b>s[i].b)
ss++;
else
k=i;
}
printf("%d\n",ss);
}
return 0;
}