汪汪汪

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 }

猜你喜欢

转载自www.cnblogs.com/scott527407973/p/10092921.html
今日推荐