Description
给n个区间[l, r],判断是否存在区间交叉。即是否存在1 <= i < j <= n,使得li < lj < ri < rj。
Input
多组数据
每组数据第一行一个整数n,第二行到第n + 1行每行两个数分别代表该区间的左右端点。
Output
如果存在交叉,输出“YES”;否则输出“NO”
思路
寻找每个线段的父类,然后再遍历比较
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdio> 4 #include <algorithm> 5 6 using namespace std; 7 const int maxn = 100005; 8 const int inf = 0x7fffffff; 9 struct node 10 { 11 int l,r; 12 } a[maxn]; 13 int cmp(node A,node B) 14 { 15 if(A.l==B.l) return A.r>B.r; 16 return A.l<B.l; 17 } 18 int main() 19 { 20 int n; 21 while(scanf("%d",&n)!=EOF) 22 { 23 int flag = 0; 24 for(int i=1; i<=n; i++) scanf("%d %d",&a[i].l,&a[i].r); 25 sort(a+1,a+n+1,cmp); 26 int s[maxn]= {0}; 27 int fa[maxn]={0}; 28 int top=0; 29 for(int i=1; i<=n; i++) 30 { 31 while(top&&a[s[top]].r<=a[i].l) top--; 32 fa[i]=s[top]; 33 s[++top]=i; 34 } 35 a[0].r = inf; 36 for(int i=2;i<=n;i++) 37 { 38 if(a[i].r>a[fa[i]].r) 39 { 40 flag = 1; 41 break; 42 } 43 } 44 if(flag) printf("YES\n"); 45 else printf("NO\n"); 46 } 47 return 0; 48 }