码迷,mamicode.com
首页 > 其他好文 > 详细

汪汪汪

时间:2019-01-28 10:45:30      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:ret   整数   输出   --   比较   ref   input   const   class   

目录

1.汪汪汪

Description

? 给n个区间[l, r],判断是否存在区间交叉。即是否存在1 <= i < j <= n,使得li < lj < ri < rj。

Input

? 多组数据

? 组数据第一行一个整数n,第二行到第n + 1行每行两个数分别代表该区间的左右端点。

Output

? 如果存在交叉,输出“YES”;否则输出“NO”

思路

? 寻找每个线段的父类,然后再遍历比较

代码

#include <iostream>
#include <cstdio>
#include <cstdio>
#include <algorithm>

using namespace std;
const int maxn = 100005;
const int inf = 0x7fffffff;
struct node
{
    int l,r;
} a[maxn];
int cmp(node A,node B)
{
    if(A.l==B.l) return A.r>B.r;
    return A.l<B.l;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int flag = 0;
        for(int i=1; i<=n; i++)  scanf("%d %d",&a[i].l,&a[i].r);
        sort(a+1,a+n+1,cmp);
        int s[maxn]= {0};
        int fa[maxn]={0};
        int top=0;
        for(int i=1; i<=n; i++)
        {
            while(top&&a[s[top]].r<=a[i].l) top--;
            fa[i]=s[top];
            s[++top]=i;
        }
        a[0].r = inf;
        for(int i=2;i<=n;i++)
        {
            if(a[i].r>a[fa[i]].r)
            {
                flag = 1;
                break;
            }
        }
        if(flag)    printf("YES\n");
        else        printf("NO\n");
    }
    return 0;
}

汪汪汪

标签:ret   整数   输出   --   比较   ref   input   const   class   

原文地址:https://www.cnblogs.com/scott527407973/p/10328267.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!