http://codeforces.com/problemset/problem/597/B
把右节点从小到大排序 在跑一遍就行了
#include <iostream> #include <cstring> #include <algorithm> #include <queue> #include <cstdio> #include <cstdlib> #include <cctype> #include <math.h> #include <ctype.h> using namespace std; #define memset(a,b) memset(a,b,sizeof(a)) #define N 500100 typedef long long ll; const double ESP = 1e-8; #define INF 0xfffffff struct node { int l,r; }a[N]; int cmp(node c,node d) { if(c.r!=d.r) return c.r<d.r; else return c.l<d.l; } int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d %d",&a[i].l,&a[i].r); } sort(a,a+n,cmp); int sum=0; int ret=-1; for(int i=0;i<n;i++) { if(a[i].l>ret) { sum++; ret=a[i].r; } } printf("%d ",sum); } return 0; }